如何离开lambda表达式的主体

我有一些列表,我做list.ForEach( l => { ... something ...}) 。 现在,在某些条件下,我需要停止迭代列表,但break不起作用 – 我得到“ Control cannot leave the body of an anonymous method or lambda expression ”编译错误。

知道如何克服这种限制吗?

单独使用break不会在这里工作,因为lambda以与for循环不同的方法执行。 break语句仅对中断当前函数的构造有用。

为了支持中断样式,您需要添加ForEach的重载,其中委托可以通过返回值指定循环执行应该中断。 例如

 public static void ForEach(this IEnumerable enumerable, Func func) { foreach (var cur in enumerable) { if (!func(cur)) { break; } } } 

现在,这个ForEach方法的使用者可以通过从提供的回调中返回false来指定break

 myCollection.ForEach(current => { if (someCondition) { // Need to break return false; } // Keep going return true; } 

lambda表达式就像一个方法一样工作。
它可以随时return

但是, List.ForEach不提供过早停止迭代的任何方法。
如果你需要break ,你只需使用一个正常的foreach循环。

您无法停止ForEach lambda中的迭代,因为您无法控制调用lambda的外部循环。 那时为什么不使用常规的foreach循环和break语句 – 对于这种情况来说,这将更具可读性。