11

有谁知道是否可以退出使用 lambda 的通用 ForEach?例如

someList.ForEach(sl =>
  {
    if (sl.ToString() == "foo")
        break;

    // continue processing sl here
    // some processing code
  }
);

此代码本身不会编译。我知道我可以使用常规的 foreach,但为了保持一致性,我想使用 lambda。

非常感谢。

4

4 回答 4

19

当然。但首先,请注意我建议不要这样做;我说序列运算符不应该有副作用,而语句应该有副作用。如果你在那个 ForEach lambda 中做某事,那么让它成为一个 foreach 循环体中的语句,而不是让它看起来像一个序列运算符。

也就是说,这就是你要做的。首先,您为自己编写一个适用于任意序列的 ForEach,而不仅仅是列表:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
    foreach(var item in sequence) action(item);
}

现在你这样写你的休息:

someList
    .TakeWhile(x=>x.ToString() != "foo")
    .ForEach(sl=>
    {/*your action here*/});
于 2010-02-12T03:09:55.420 回答
10

来自MSDN

以下规则适用于 lambda 表达式中的变量范围:

snip

lambda 表达式不能包含 goto 语句、break 语句或 continue 语句,其目标位于主体之外或包含的匿名函数的主体中。

考虑到您发布的代码,不知道这是否有帮助。相关引用来自 MSDN 文章的末尾。

于 2010-02-12T03:10:02.337 回答
2

警告:请不要认真对待以下代码,仅供娱乐!

您可以像这样提前返回“模拟”继续:

Enumerable.Range(1, 20)
          .ForEach(n =>
                {
                    if (n == 10) return;
                    Console.WriteLine("This is not 10: {0}", n);
                });

也就是说,我认为 lambda 中的副作用表明你做错了。改用适当的 foreach 。或者像 TakeWhile 之类的东西,正如 Eric 已经很好地展示的那样。

于 2010-02-12T09:12:49.290 回答
1

这个怎么样?

        Enumerable.Range(1, 10)
        .Where(x => x % 2 != 0)
        .ToList()
        .ForEach(x => Console.WriteLine(x));
于 2010-02-12T09:47:29.207 回答