可能重复:
Lambda Expression using Foreach Clause…
Why is there not a ForEach extension method on the IEnumerable interface?
这看起来很基本。我正在尝试迭代IEnumerable的每个对象。看来我必须先把它放到一个列表中。是对的吗?在我看来,IEnumerable上应该有一个扩展方法来执行此操作。我不得不自己做对,我已经厌倦了。我在某处错过了吗?
myEnumerable.ToList().ForEach(...)
我想这样做:
myEnumerable.ForEach(...)
答案 0 :(得分:4)
不,没有内置的ForEach
扩展方法。尽管如此,这很容易实现:
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);
}
}
}
但为什么要这么麻烦?与Eric Lippert explains in this blog post一样,标准foreach
语句比副作用ForEach
方法更具可读性 - 在哲学上更合适:
myEnumerable.ForEach(x => Console.WriteLine(x));
// vs
foreach (var x in myEnumerable) Console.WriteLine(x);
答案 1 :(得分:4)
不,没有。 Eric Lippert在他的blog中讨论了为什么省略了这个功能:
许多人问我为什么没有Microsoft提供的“ForEach”序列运算符扩展方法。
总结两个主要原因是:
ForEach
违反了所有其他序列运算符所依据的函数式编程原则 - 没有副作用。ForEach
方法不会为语言添加新的代表能力。使用foreach语句可以更轻松地实现相同的效果。 答案 2 :(得分:0)
不,没有这样的扩展方法。 List<T>
公开了一个名为ForEach
的真实方法(自.NET 2.0以来一直存在)。
答案 3 :(得分:0)
有一些关于它的讨论here。它不是框架工作的内置,但您可以滚动自己的扩展方法并以这种方式使用它。从我能说的话来看,这可能是你最好的选择。
我一直处于同样的境地。
public static class Extensions {
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) {
foreach (var item in source) {
action(item);
}
}
}
答案 4 :(得分:0)