Linq - 是否有我忽略的 `IEnumerable.ForEach` 扩展方法?

40 浏览
0 Comments

Linq - 是否有我忽略的 `IEnumerable.ForEach` 扩展方法?

这个问题已经在这里有了答案:

可能的重复:

使用foreach子句的Lambda表达式...

为什么在IEnumerable接口上没有ForEach扩展方法?

这似乎很基础。我想要迭代IEnumerable的每个对象。看来我必须先将其转换为列表。是这样吗?对我来说,应该有一个在IEnumerable上的扩展方法来完成这个操作。我一直在写自己的方法,现在已经厌倦了。我是否遗漏了它的位置?

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

我想要做到这一点:

myEnumerable.ForEach(...)

admin 更改状态以发布 2023年5月22日
0
0 Comments

没有。Eric Lippert在他的博客中提到了这个特性为何被省略:

许多人问我为什么没有提供由 Microsoft 提供的“ForEach”序列操作器扩展方法。

总结起来有两个主要原因:

  • 使用 ForEach 违反了所有其他序列操作器基于的函数式编程原则 - 没有副作用。
  • ForEach 方法不会给语言添加任何新的表示能力。使用 foreach 语句可以更清楚地实现同样的效果。
0
0 Comments

没有内置的ForEach扩展方法。不过自己实现也很容易:

public static class EnumerableExtensions
{
    public static void ForEach(this IEnumerable source, Action action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");
        foreach (T item in source)
        {
            action(item);
        }
    }
}

但是为什么需要这么做呢?正如Eric Lippert在这篇博客文章中所解释的那样,标准的foreach语句更易读,而"产生副作用"的ForEach方法在哲学上也不太适合:

myEnumerable.ForEach(x => Console.WriteLine(x));
// vs
foreach (var x in myEnumerable) Console.WriteLine(x);

0