关于.net:Linq – 是否有IEnumerable.ForEach< T>

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语句可以更清楚地实现相同的效果。


不,没有内置的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);
        }
    }
}

但是为什么要麻烦呢?正如埃里克·利珀特在这篇博客文章中所解释的,标准的ForEach语句比影响ForEach方法更易读,在哲学上更合适:

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);
    }
  }
}

不,没有这种扩展方法。List公开了一个名为ForEach的实方法(该方法自.NET 2.0以来一直存在)。