ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

     // otherwise process number
 }
用他们的错误输入通知用户与跳过它一样重要!

C
Community

你要:

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

    // do work
}

以下是有关 continue keyword 的更多信息。

更新:针对布赖恩在评论中的后续问题:

如果我嵌套了 for 循环并想跳过其中一个扩展循环的迭代,您能否进一步澄清我会做什么? for (int[] numbers in numberarrays) { for (int number in numbers) { // 如果我想跳转 (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;
D
Dustin Campbell

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

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

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

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


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

:) 谢谢!我提出了一个基本示例,因为在循环的开头有一些不需要处理的标准,还有一些需要捕获的错误。
一个基于 LINQ 的答案很好,而且很优雅,但是使用 if 语句并没有错。
T
Tamas Czinege
foreach ( int number in numbers )
{
    if ( number < 0 )
    {
        continue;
    }

    //otherwise process number
}

K
Kev

您可以使用 continue 语句。

例如:

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

A
AlexB

使用 linq 的另一种方法是:

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

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

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


这是执行此操作的最简单(尽管内部逻辑可能相同)的方法 - 现在您可以使用 Linq。尽管出于性能原因,您应该确保 .Skip 仅调用一次。 (是的,我现在看到这不是对 OP 问题的直接答案,尽管对这个答案列表很有价值)。 +1
这与问题无关。它将跳过前 n 个元素,而不是小于 0 的元素。
M
Millicent Achieng

使用 continue 语句:

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

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

最简单的方法如下:

//Skip First Iteration

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

//Skip any other like 5th iteration

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

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