解析在内部循环中Continue外部循环的使用详解

有时候你希望在一个嵌套循环的外层循环中执行Continue操作。例如,假设你有一连串的标准,和一堆items。

并且你希望找到一个符合每个标准的item。


代码如下:

match = null;
foreach(var item in items)
{
  foreach(var criterion in criteria)
  {
    if (!criterion.IsMetBy(item)) //如果不符合标准
    {
        //那么说明这个item肯定不是要查找的,那么应该在外层循环执行continue操作
    }
  }
  match = item;
  break;
}

有很多方法可以实现这个需求,这里有一些:

方法#1(丑陋的goto):使用goto语句。


代码如下:

match = null;
foreach(var item in items)
{
  foreach(var criterion in criteria)
  {
    if (!criterion.IsMetBy(item))
    {
      goto OUTERCONTINUE;
    }
  }
  match = item;
  break;

OUTERCONTINUE:

}

如果不符合其中的一个标准,那么goto OUTCONTINUE:,接着检查下一个item。

方法#2(优雅,漂亮):

当你看到一个嵌套循环,基本上你总是可以考虑将内部的循环放到一个它自己的方法中:


代码如下:

match = null;
foreach(var item in items)
{
  if (MeetsAllCriteria(item, critiera))
  {
    match = item;
    break;
  }
}

MeetsAllCriteria方法的内部很明显应该是


代码如下:

foreach(var criterion in criteria)
  if (!criterion.IsMetBy(item))
    return false;
return true;

方法#3,使用标志位:


代码如下:

match = null;
foreach(var item in items)
{
 foreach(var criterion in criteria)
 {
   HasMatch=true;
   if (!criterion.IsMetBy(item))
   {
     // No point in checking anything further; this is not
     // a match. We want to “continue” the outer loop. How?
    HasMatch=false;
    break;
   }
 }
 if(HasMatch) {
    match = item;
    break;
 }
}

方法#4,使用Linq。


代码如下:

var matches = from item in items
              where criteria.All(
                criterion=>criterion.IsMetBy(item))
              select item;
match = matches.FirstOrDefault();

对于在items中的每个item,都检查是否满足所有的标准。

(0)

相关推荐

  • 解析在内部循环中Continue外部循环的使用详解

    有时候你希望在一个嵌套循环的外层循环中执行Continue操作.例如,假设你有一连串的标准,和一堆items. 并且你希望找到一个符合每个标准的item. 复制代码 代码如下: match = null;foreach(var item in items){  foreach(var criterion in criteria)  {    if (!criterion.IsMetBy(item)) //如果不符合标准    {        //那么说明这个item肯定不是要查找的,那么应该在

  • Verilog语言的循环语句示例详解

    目录 关键词:while, for, repeat, forever while 循环 for 循环 repeat 循环 forever 循环 关键词:while, for, repeat, forever Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环.循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式. while 循环 while 循环语法格式如下: while (condition) begin -

  • Redis源码解析:集群手动故障转移、从节点迁移详解

    一:手动故障转移 Redis集群支持手动故障转移.也就是向从节点发送"CLUSTER  FAILOVER"命令,使其在主节点未下线的情况下,发起故障转移流程,升级为新的主节点,而原来的主节点降级为从节点. 为了不丢失数据,向从节点发送"CLUSTER  FAILOVER"命令后,流程如下: a:从节点收到命令后,向主节点发送CLUSTERMSG_TYPE_MFSTART包:          b:主节点收到该包后,会将其所有客户端置于阻塞状态,也就是在10s的时间内

  • 对python中的控制条件、循环和跳出详解

    对python中的控制条件.循环和跳出详解 代码缩进(代码块): python用缩进表示代码块,没有其他语言的大括号 缩进是强制检查,整个代码缩进必须一致,否则无法运行 用2.4个空格或者tab缩进 ide自动保证缩进一致 If.elif和else的条件分支: if if...else if...elif..else 没有switch.case语法 空的列表.元祖.字符串.0都被评估为False None被评估为False 控制条件后面必须加":" a=100 if a > 80

  • 对python while循环和双重循环的实例详解

    废话不多说,直接上代码吧! #python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务. #while是"当型"循环结构. i=1 while i<=20: print(i,end=" ") i+=1 sum=0 i=1 while i<=100: sum+=i i+=1 else: print("\n",sum) print("0+2+...+100=",su

  • Go语言学习之循环语句使用详解

    目录 1.for循环 2.for-each语法 3.break的使用 4.continue的使用 5.goto的使用 1.for循环 写法基本和其他语言一致,只是没有了while循环,用for代替while. 样例代码如下 // for循环 func loop1() { sum := 0 for i := 0; i < 100; i++ { sum += i } fmt.Printf("sum = %d\n", sum) // 和while循环一样 sum1 := 3 for s

  • Golang跳转语句continue与goto使用语法详解

    目录 continue 基本介绍 基本语法 示意图及案例 goto 基本介绍 基本语法及入门 continue 基本介绍 1,continue语句用于结束本次循环,继续执行下一次循环 2,continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和break的标签使用的规则一样 基本语法 { ...... continue ....... } 示意图及案例 以for循环为例 package main import "fmt" func main(){

  • Java 读取外部资源的方法详解及实例代码

    Java 读取外部资源的方法详解 在Java代码中经常有读取外部资源的要求:如配置文件等等,通常会把配置文件放在classpath下或者在web项目中放在web-inf下. 1.从当前的工作目录中读取: try { BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("wkdir.txt"))); String str; while ((str = in.readLine())

  • Linux shell数组循环的实例详解

    shell数组循环 测试shell数组,循环的例子: arr=("a" "b" "c") echo "所有的内容如下:"${arr[@]} echo "数组的长度:"${#arr[*]} for var in ${arr[@]} do echo "打印的内容:"$var done 输出的内容如下: 以上就是Linux shell数组循环的实例详解,如有疑问请留言或者到本站社区交流讨论,感

  • Three.js加载外部模型的教程详解

    1.  首先我们要在官网: https://threejs.org/ 下载我们three.js压缩包,并将其中的build文件夹下的three.js通过script标签对的src属性导入到我们的页面中 2.  创建three.js核心对象 Scene(场景) Camera(相机) Light(光源) Mesh(模型) Renderer(渲染器) 最后一步就是渲染显示在我们的页面上了renderer.render(scene,camera) 3.  OBJ模型的导入 <script type=&quo

随机推荐