c#exit使用lambda的genericsForEach
有谁知道是否可以退出使用lambda的通用ForEach? 例如
someList.ForEach(sl => { if (sl.ToString() == "foo") break; // continue processing sl here // some processing code } );
这段代码本身不会编译。 我知道我可以使用常规foreach但为了保持一致性我想使用lambda。
非常感谢。
当然。 但首先,请注意我建议不要这样做; 我说序列操作符不应该有副作用,并且语句应该有副作用。 如果你在ForEach lambda中做了一些事情,那么在foreach循环的主体中做一个声明,而不是让它看起来像一个序列操作符。
那就是说,这就是你做的。 首先,你自己写一个ForEach,它可以处理任意序列,而不仅仅是列表:
public static void ForEach(this IEnumerable sequence, Action action) { foreach(var item in sequence) action(item); }
现在你写下你的rest:
someList .TakeWhile(x=>x.ToString() != "foo") .ForEach(sl=> {/*your action here*/});
来自MSDN
以下规则适用于lambda表达式中的变量范围:
snip
lambda表达式不能包含goto语句,break语句或continue语句,其目标位于正文之外或包含匿名函数的正文中。
根据您发布的代码,不知道这是否有帮助。 相关引用来自MSDN文章的末尾。
警告:以下代码不应被认真对待,仅用于娱乐目的!
您可以像这样“模拟”一个早期返回的继续:
Enumerable.Range(1, 20) .ForEach(n => { if (n == 10) return; Console.WriteLine("This is not 10: {0}", n); });
也就是说,我认为lambda中的副作用表明你做错了。 使用适当的foreach代替。 或像TakeWhile这样的东西,正如埃里克亲切地certificate的那样。
这个怎么样?
Enumerable.Range(1, 10) .Where(x => x % 2 != 0) .ToList() .ForEach(x => Console.WriteLine(x));