如何跳过“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”循环的迭代?的主要内容,如果未能解决你的问题,请参考以下文章