Linq - Is there a IEnumerable.ForEach<T> extension method that I'm missing?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicates:
Lambda Expression using Foreach Clause…
Why is there not a ForEach extension method on the IEnumerable interface?
号
这似乎很基本。我正在尝试迭代IEnumerable的每个对象。看来我得先把它列出来。是吗?在我看来,IEnumerable上应该有一个扩展方法来实现这一点。我一直要自己做,我已经厌倦了。我是不是找不到了?
1 | myEnumerable.ToList().ForEach(...) |
我想这样做:
1 | myEnumerable.ForEach(...) |
号
不,没有。Eric Lippert在他的博客中谈到了为什么省略这个功能:
A number of people have asked me why there is no Microsoft-provided"ForEach" sequence operator extension method.
号
总之,两个主要原因是:
- 使用
ForEach 违反了所有其他序列运算符都基于无副作用的功能编程原则。 ForEach 方法不会给语言增加新的表示能力。使用foreach语句可以更清楚地实现相同的效果。
不,没有内置的
1 2 3 4 5 6 7 8 9 10 11 12 13 | public static class EnumerableExtensions { public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { if (source == null) throw new ArgumentNullException("source"); if (action == null) throw new ArgumentNullException("action"); foreach (T item in source) { action(item); } } } |
但是为什么要麻烦呢?正如埃里克·利珀特在这篇博客文章中所解释的,标准的
1 2 3 | myEnumerable.ForEach(x => Console.WriteLine(x)); // vs foreach (var x in myEnumerable) Console.WriteLine(x); |
号
IEnumerable没有此扩展方法。
阅读埃里克·利珀特的博客了解其背后的原因。
所以,如果你需要它,你必须自己写:)
这里有一些关于它的讨论。它不是内置于框架中的,但是您可以滚动自己的扩展方法并以这种方式使用它。据我所知,这可能是你最好的赌注。
我也遇到过同样的情况。
1 2 3 4 5 6 7 | public static class Extensions { public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach (var item in source) { action(item); } } } |
不,没有这种扩展方法。