Linq - 我缺少一个IEnumerable.ForEach <t>扩展方法吗?</t>

时间:2010-10-06 14:16:23

标签: .net linq .net-4.0 extension-methods

  

可能重复:
  Lambda Expression using Foreach Clause…
  Why is there not a ForEach extension method on the IEnumerable interface?

这看起来很基本。我正在尝试迭代IEnumerable的每个对象。看来我必须先把它放到一个列表中。是对的吗?在我看来,IEnumerable上应该有一个扩展方法来执行此操作。我不得不自己做对,我已经厌倦了。我在某处错过了吗?

myEnumerable.ToList().ForEach(...)

我想这样做:

myEnumerable.ForEach(...)

5 个答案:

答案 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)

IEnumerable没有这种扩展方法。

阅读Eric Lippert的博客here,了解其背后的原因。

因此,如果您需要它,您将自己编写它:)