C# 在ForEach函数中模拟break语句

C# 在ForEach函数中模拟break语句,c#,lambda,C#,Lambda,这更多的是一个假设问题,因为我越来越多地使用.NET3.5以及lambda表达式和匿名委托。举个简单的例子: static void Main(string[] args) { List<int> numList = new List<int>(int[] { 1, 3, 5, 7, 9, 11, 12, 13, 15 }); numList.ForEach(i => { if (i % 2 == 1) Con

这更多的是一个假设问题,因为我越来越多地使用.NET3.5以及lambda表达式和匿名委托。举个简单的例子:

static void Main(string[] args)
{
   List<int> numList = new List<int>(int[] { 1, 3, 5, 7, 9, 11, 12, 13, 15 });

   numList.ForEach(i =>
   {
       if (i % 2 == 1)
           Console.Write(i);
       else
           return;
   });

   Console.ReadLine();
}
static void Main(字符串[]args)
{
List numList=新列表(int[]{1,3,5,7,9,11,12,13,15});
numList.ForEach(i=>
{
如果(i%2==1)
控制台。写入(i);
其他的
返回;
});
Console.ReadLine();
}
这将产生以下输出:

13579111315

当然,我真正希望它在12之后停止执行ForEach函数,而不是打印13或15。在传统的foreach构造中,将有一个中断(而不是我的示例中的返回),循环将结束。然而,在这种情况下,休息是非法的。您将收到以下消息:

没有要中断或继续的封闭循环


这里是否有一种构造可以很容易地使用以获得所需的结果,或者如果您不打算在列表的每个成员上实际运行所需的代码,那么在这种情况下使用标准的foreach循环更好?

只需使用标准的
foreach
循环即可。这几乎总是比使用lambda表达式更简单、更容易理解-您不会对捕获的变量等产生混淆

你可能希望阅读


List.ForEach
非常有用,如果您收到了一个委托,您只想在列表中的每个元素上执行它,否则我会坚持使用普通语言功能。

谢谢您的链接。我有一种感觉,这就是答案,但我很好奇别人怎么想。有时候,lambda似乎真的被过度使用了,而不是传统的序列。@Nick:是的,我知道你的意思。到处都有使用它们的诱惑……有趣的是,在使用.NET并行foreach构造时,这也是一个问题,该构造使用委托的方式基本相同。他们的解决方案是添加一个LoopState机制。您可以在这里看到一个示例:@LBushkin-感谢您添加的信息。。。当我写我的问题时,我没有想到并行扩展,但同样的问题肯定会出现。