Linq - 是否有我忽略的 `IEnumerable.ForEach` 扩展方法?
Linq - 是否有我忽略的 `IEnumerable.ForEach` 扩展方法?
这个问题已经在这里有了答案:
可能的重复:
这似乎很基础。我想要迭代IEnumerable的每个对象。看来我必须先将其转换为列表。是这样吗?对我来说,应该有一个在IEnumerable上的扩展方法来完成这个操作。我一直在写自己的方法,现在已经厌倦了。我是否遗漏了它的位置?
myEnumerable.ToList().ForEach(...)
我想要做到这一点:
myEnumerable.ForEach(...)
admin 更改状态以发布 2023年5月22日
没有。Eric Lippert在他的博客中提到了这个特性为何被省略:
许多人问我为什么没有提供由 Microsoft 提供的“ForEach”序列操作器扩展方法。
总结起来有两个主要原因:
- 使用
ForEach
违反了所有其他序列操作器基于的函数式编程原则 - 没有副作用。 ForEach
方法不会给语言添加任何新的表示能力。使用 foreach 语句可以更清楚地实现同样的效果。
没有内置的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);