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,因此你无法破解.
Dea*_*alk 10
而不是使用中断,首先执行这样的过滤器(它可能不是您需要的精确过滤器,但说明了这一点)
lstTemp.Where(i => i!= 3).ForEach(i=> // do sth);
Run Code Online (Sandbox Code Playgroud)
return将作为continue在ForEach.
例:
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 - 跳过.
我的解释是:ForEach是一种方法,而不是语言特性。C#foreach构造是该语言的一项功能,其他语言可以在其中进行构造break并被continue允许。
我还想指出(不是试图判断,只是进行观察),这是为什么一些开发人员反对使用方法的一个很好的例子ForEach:在这个简单的情况下,它并没有真正节省打字,它还需要一个方法重定向超出了必要的范围,并且无论如何它都不具备所有功能foreach。
在我看来,方法有意义的主要场景ForEach是作为 -- 的扩展,IEnumerable<T>放在方法调用链的末尾。(对我来说)他们将其添加到List<T>.
要仅迭代部分项目并完美模拟中断,您可以使用FirstOrDefault:
lstTemp.FirstOrDefault(i=>
{
if (i == 3)
return true;
//do stuff
return false;
}
);
Run Code Online (Sandbox Code Playgroud)
对于包含100000个项目的列表,如果第10个项目为3,它将仅迭代10次,使用该Where解决方案将起作用,但首先迭代整个列表.