如何跳过“foreach”循环的迭代?

Posted

技术标签:

【中文标题】如何跳过“foreach”循环的迭代?【英文标题】:How do I skip an iteration of a `foreach` loop? 【发布时间】:2010-10-13 20:06:24 【问题描述】:

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

有没有办法跳过一个迭代并跳转到 C# 中的下一个循环?

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

     // otherwise process number
 

【问题讨论】:

通知用户输入错误与跳过它一样重要! 【参考方案1】:

使用 continue 语句:

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

【讨论】:

不明白为什么要投票,这是错误的,因为他循环的是“o”,而不是“number” 同意,也许这是以前答案的复制/粘贴?概念上很有价值,因为它是一个 foreach,但请确保变量是一致的。【参考方案2】:

最简单的方法如下:

//Skip First Iteration

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

//Skip any other like 5th iteration

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

【讨论】:

这与问题有什么关系?您所做的只是跳过第一个(或前五个元素),而不考虑任何其他标准。 OP 想知道他如何跳过一个迭代(任何)并继续下一个迭代。【参考方案3】:

另一种使用 linq 的方法是:

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

如果你想跳过许多项目中的第一个。

如果要指定跳过条件,请使用.SkipWhere

【讨论】:

这是最简单的(虽然里面的逻辑可能是相同的)方法——现在你有 Linq 可用。尽管出于性能原因,您应该确保 .Skip 仅调用一次。 (是的,我现在看到这不是对 OP 问题的直接答案,尽管对这个答案列表很有价值)。 +1【参考方案4】:

你想要:

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

    // do work

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


更新:回应布赖恩在 cmets 的后续问题:

您能否进一步说明如果我嵌套了 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 keyword 的文档,请参见此处。 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 循环并想跳过其中一个扩展循环的迭代,我会怎么做? ex: for (int[] numbers in numberarrays) for (int number in numbers) //如果要跳转(numbers/numberarrays)怎么办 C# 的goto 实际上对于@Brian 询问的情况很有用。在外部循环的底部添加一个标签,例如nextArray:,然后在您想跳到它时添加goto nextArray;【参考方案5】:

您可以使用continue 语句。

例如:

foreach(int number in numbers)

    if(number < 0)
    
        continue;
    

【讨论】:

【参考方案6】:

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

foreach ( int number in numbers.Where(n => n >= 0) )

    // process number

【讨论】:

+1。虽然这不是对这个问题的直接回应,但实际上我可能更喜欢这个解决方案而不是我提出的那个解决方案。使用 LINQ 似乎是一个很好的通用用例,可以过滤掉您不想处理的循环值。 这只是更整洁还是实际上会更快,因为需要更少的 foreach?我猜 LINQ 得到了极大的优化,但是 LINQ 部分必须在某个时候进行 foreach,所以理论上如果数据集很大并且生成的“过滤”子集几乎一样大,那么这将因为 foreach 必须发生而变慢两次?所以也许它取决于预期的结果子数据集?【参考方案7】:

你也可以翻转你的 if 测试:


foreach ( int number in numbers )

     if ( number >= 0 )
     
        //process number
     
 

【讨论】:

:) 谢谢!我提出了一个基本示例,因为在循环的开头有一些不需要处理的标准,而另一些则是需要捕获的错误。 一个基于 LINQ 的答案很好,也很优雅,但使用 if 语句并没有错。【参考方案8】:
foreach ( int number in numbers )

    if ( number < 0 )
    
        continue;
    

    //otherwise process number

【讨论】:

以上是关于如何跳过“foreach”循环的迭代?的主要内容,如果未能解决你的问题,请参考以下文章

java foreach 跳过第一次迭代

Swiftui foreach 内部参数

何时使用 forEach(_:) 而不是 for in?

如何在 smarty 中找到 foreach 循环的最后一个索引

如何跳过循环中的迭代?

如何跳过循环中的迭代?