ForEach() : Why can't use break/continue inside
由于ForEach()方法遍历所有列表成员,所以为什么不能使用break / continue子句,而我却可以在正常的foreach循环中使用它们
1 2 3 4 5 6 7 | lstTemp.ForEach(i=> { if (i == 3) break; //do sth } ); |
错误:
"No enclosing loop out of which to
break or continue"
因为
通常,
1 2 3 4 5 | public static ForEach< T >(this IEnumerable< T > input, Action< T > action) { foreach(var i in input) action(i); } |
因为它是一个普通的方法调用,所以
大概是因为您使用的是lambda,而lambda的内容对于在循环内使用的事实一无所知。
例:
1 2 3 4 5 6 7 8 | var list = new List<int>() {1, 2, 3, 4}; list.ForEach(i => { if (i == 3) return; Console.WriteLine(i); } ); |
打印1、2、4。
3-跳过。
与其先休息,不如先做一个过滤器(它可能不是您需要的确切过滤器,但说明了要点)
1 | lstTemp.Where(i => i!= 3).ForEach(i=> // do sth); |
要仅迭代部分项并完美模拟中断,可以使用
1 2 3 4 5 6 7 8 9 10 | lstTemp.FirstOrDefault(i=> { if (i == 3) return true; //do stuff return false; } ); |
对于包含100000个项目的列表,如果第10个项目为3,它将仅迭代10次,使用
我的解释方式是:
我还要指出(不做判断,只是做一个观察),这是一个很好的例子,说明为什么某些开发人员反对使用
在我看来,
因为ForEach是一种方法,因此不是常规的foreach循环,需要在常规的foreach循环中遍历lstTemp进行迭代,以防发生中断,但是如果继续,请在ForEach方法内使用return。
1 2 3 4 5 6 7 | var lstTemp = new List<int>() {1, 2, 3, 4}; lstTemp.ForEach(i=> { if (i == 3) return; //do sth Console.WriteLine(i); }); |
输出:1、2、4
中断和继续是需要编译器支持的C#语言关键字。对于C#编译器来说,ForEach只是一种方法。
您可以编写扩展方法" ForEachWhile",该方法采用
因为您为列表中的每个项目委派了一个动作。
我用了
1 2 3 4 5 6 7 8 9 10 | list.ForEach((item) => { if( isBreak == false ) do { if (isContinue) break; // TODO } while (false); } }); |