ForEach():为什么不能在内部使用break/continue

Ram*_*eef 15 c# foreach continue break

由于ForEach()方法遍历所有列表成员,为什么不能使用break/continue子句,而我可以在正常的foreach循环中使用它们

lstTemp.ForEach(i=>
 {
   if (i == 3)
   break;
   //do sth
 }
);
Run Code Online (Sandbox Code Playgroud)

错误:

"没有封闭的环可以打破或继续"

Fem*_*ref 20

因为ForEach是方法而不是常规foreach循环.ForEach如果您需要中断或继续lstTemp使用常规foreach循环迭代,那么该方法适用于简单任务.

通常,ForEach实现如下:

public static ForEach<T>(this IEnumerable<T> input, Action<T> action)
{
  foreach(var i in input)
    action(i);
}
Run Code Online (Sandbox Code Playgroud)

因为这是一个正常的方法调用,action所以对封闭一无所知foreach,因此你无法破解.


acr*_*ron 17

大概是因为你正在使用lambda而lambda的内容对于在循环中使用它的事实一无所知.


Dea*_*alk 10

而不是使用中断,首先执行这样的过滤器(它可能不是您需要的精确过滤器,但说明了这一点)

lstTemp.Where(i => i!= 3).ForEach(i=> // do sth);
Run Code Online (Sandbox Code Playgroud)


Tar*_*asB 9

return将作为continueForEach.

例:

var list = new List<int>() {1, 2, 3, 4};
list.ForEach(i => 
    {
        if (i == 3)
            return;
        Console.WriteLine(i);
    }
);
Run Code Online (Sandbox Code Playgroud)

打印1,2,4.

3 - 跳过.


Dan*_*Tao 5

我的解释是:ForEach是一种方法,而不是语言特性。C#foreach构造是该语言的一项功能,其他语言可以在其中进行构造break并被continue允许。

我还想指出(不是试图判断,只是进行观察),这是为什么一些开发人员反对使用方法的一个很好的例子ForEach:在这个简单的情况下,它并没有真正节省打字,它还需要一个方法重定向超出了必要的范围,并且无论如何它都不具备所有功能foreach

在我看来,方法有意义的主要场景ForEach是作为 -- 的扩展,IEnumerable<T>放在方法调用链的末尾。(对我来说)他们将其添加到List<T>.


Sha*_*ard 5

要仅迭代部分项目并完美模拟中断,您可以使用FirstOrDefault:

lstTemp.FirstOrDefault(i=>
 {
   if (i == 3)
       return true;

   //do stuff

   return false;
 }
);
Run Code Online (Sandbox Code Playgroud)

对于包含100000个项目的列表,如果第10个项目为3,它将仅迭代10次,使用该Where解决方案将起作用,但首先迭代整个列表.