在Perl中,我可以使用next;命令跳过foreach(或任何循环)迭代。

是否可以跳过迭代并跳转到C#中的下一个循环?

 foreach (int number in numbers)
 {
     if (number < 0)
     {
         // What goes here to skip over the loop?
     }

     // otherwise process number
 }


评论

通知用户输入错误与跳过输入一样重要!

#1 楼

您想要:
foreach (int number in numbers) //   <--- go back to here --------+
{                               //                                |
    if (number < 0)             //                                |
    {                           //                                |
        continue;   // Skip the remainder of this iteration. -----+
    }

    // do work
}

这里有更多关于continue关键字的信息。

更新:针对评论中Brian的后续问题:您进一步阐明了如果我嵌套了for循环并想跳过扩展循环之一的迭代怎么办?
for (int[] numbers in numberarrays) {
  for (int number in numbers) { // What to do if I want to
                                // jump the (numbers/numberarrays)?
  }
}


continue始终适用于最近的封闭范围,因此您无法使用它打破最外层的循环。如果出现这样的情况,则需要根据实际需要执行更复杂的操作,例如,内循环break,外循环continue。有关break关键字的文档,请参见此处。 break C#关键字与Perl last关键字相似。
另外,请考虑采用Dustin的建议,以过滤掉不需要预先处理的值:
foreach (var basket in baskets.Where(b => b.IsOpen())) {
  foreach (var fruit in basket.Where(f => f.IsTasty())) {
    cuteAnimal.Eat(fruit); // Om nom nom. You don't need to break/continue
                           // since all the fruits that reach this point are
                           // in available baskets and tasty.
  }
}


评论


您能否进一步说明如果嵌套了循环并想跳过扩展循环之一的迭代该怎么办?例如:for(int []数字数组中的数字){for(int数字中数字){//如果要跳过(numbers / numberarrays)怎么办}}}

–布赖恩
2009年3月17日14:09

C#的goto实际上对于@Brian询问的情况很有用。在外部循环的底部添加一个标签,例如nextArray:,然后转到nextArray;。当你想跳到它。

–雅各布·克拉尔(Jacob Krall)
16-10-14在17:21

#2 楼

另一种方法是在循环执行之前使用LINQ进行过滤:

foreach ( int number in numbers.Where(n => n >= 0) )
{
    // process number
}


评论


+1。尽管这不是对问题的直接回答,但实际上,我可能更喜欢此解决方案而不是我提出的解决方案。使用LINQ似乎是一个很好的通用用例,用于过滤掉您不想处理的循环值。

–约翰·费米内拉(John Feminella)
09年3月17日在14:04

这只是比较整齐,还是实际上会更快,因为要进行的教学更少?我猜想LINQ进行了很大的优化,但是LINQ部分将不得不在某个时候进行取值,因此从理论上讲,如果数据集很大并且生成的“已过滤”子集几乎一样大,那么这将变慢,因为必须进行取取两次?因此,也许取决于预期的结果子数据集?

–勺子
2012年9月10日于20:58

#3 楼

您还可以翻转if测试:


foreach ( int number in numbers )
{
     if ( number >= 0 )
     {
        //process number
     }
 }


评论


:) 谢谢!我提出一个基本示例,因为在循环开始时有一些标准不需要处理,而另一些标准则需要捕获错误。

–布赖恩
09年3月17日在13:06

一个基于LINQ的答案很好并且很优雅,但是使用if语句并没有错。

– crashmstr
2011年10月7日14:45

#4 楼

foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}


#5 楼

使用linq的另一种方法是:

foreach ( int number in numbers.Skip(1))
{   
    // process number  
}


如果要跳过多个项目中的第一个。

或使用.SkipWhere指定跳过的条件。

评论


这是最简单的方法(尽管内部逻辑可能是相同的),因为您现在可以使用Linq。尽管您应确保由于性能原因仅调用一次.Skip。 (是的,我现在看到,这不是对OP问题的直接答案,尽管是此答案列表的重要补充)。 +1

– B Charles H
'18 -10-1在16:40



#6 楼

您可以使用continue语句。

例如:

foreach(int number in numbers)
{
    if(number < 0)
    {
        continue;
    }
}


#7 楼

使用继续语句:

foreach(object number in mycollection) {
     if( number < 0 ) {
         continue;
     }
  }


评论


不明白为什么要投票,这是错误的,因为他循环了“ o”而不是“ number”

–财富
16年7月19日在7:56

同意,也许这是先前答案的副本/粘贴内容?从概念上讲,它是有价值的,但请确保变量一致。

– Antonio Ciolino
17年1月17日14:56

#8 楼

最简单的方法如下:

//Skip First Iteration

foreach ( int number in numbers.Skip(1))

//Skip any other like 5th iteration

foreach ( int number in numbers.Skip(5))