如何离开lambda表达式的主体

时间:2012-01-30 20:08:34

标签: c# lambda

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

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

3 个答案:

答案 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语句 - 对于这种情况来说,这将更具可读性。