我有一些列表,我做list.ForEach( l => { ... something ...})
。现在,在某些情况下我需要停止迭代列表,但break
不起作用 - 我得到“Control cannot leave the body of an anonymous method or lambda expression
”编译错误。
知道如何克服这种限制吗?
答案 0 :(得分:8)
单独使用break
在这里不起作用,因为lambda以与for循环不同的方法执行。 break
语句仅对中断当前函数的构造有用。
为了支持中断样式,您需要添加ForEach
的重载,其中委托可以通过返回值指定循环执行应该中断。例如
public static void ForEach<T>(this IEnumerable<T> enumerable, Func<T, bool> func) {
foreach (var cur in enumerable) {
if (!func(cur)) {
break;
}
}
}
现在,此ForEach
方法的使用者可以通过从提供的回调中返回break
来指定false
myCollection.ForEach(current => {
if (someCondition) {
// Need to break
return false;
}
// Keep going
return true;
}
答案 1 :(得分:6)
lambda表达式就像一个方法一样
它可以随时return
。
但是,List.ForEach
没有提供过早停止迭代的任何方法
如果您需要break
,则只需使用正常的foreach
循环。
答案 2 :(得分:1)
由于您无法控制调用lambda的外部循环,因此无法在ForEach
lambda中停止迭代。那时为什么不使用常规foreach
循环和break
语句 - 对于这种情况来说,这将更具可读性。