为什么ForEach方法仅适用于列表

Ela*_*ich 9 .net c# ienumerable

从我所看到的,该ForEach方法仅适用于List 该类.

这是为什么?我认为没有理由ForEach不让任何实现IEnumerable/ IEnumerator接口的类可用,如果你需要执行一个小动作,这是一个非常有用的方法(1行比1行+ 2样板文件foreach语法更易读... ).

更新:我会澄清我的问题.包含ForEach序列的原因是完全正确的.不包括ForEach在所有序列中有充分的理由.

但我无法理解为什么会ForEach包含在一些序列中.

Ahm*_*eed 23

请参阅Eric Lippert的帖子:"foreach"vs"ForEach"

很多人问我为什么没有Microsoft提供的"ForEach"序列运算符扩展方法.List类当然已经有了这样的方法,但是没有理由不能将这样的方法创建为所有序列的扩展方法.

...

但我们可以在这里更深入一点.出于两个原因,我在哲学上反对提供这样的方法.

...

第一个原因是这样做违反了所有其他序列运算符所基于的函数式编程原则.显然,调用此方法的唯一目的是引起副作用.

...

第二个原因是,这样做会增加语言的新代表性能力.

...

那么,VS Languages团队对List中的内容没有任何影响.我个人觉得List上的"ForEach"方法在哲学上令人不安,因为我会在IEnumerable麻烦上找到一个扩展方法.(并且VSL团队确实控制了这一点.)一个缓解因素是List显然被设计为一个可变的,不会副作用的数据结构,所以使用变异它的表达式似乎稍微不那么糟糕. - 埃里克


Mat*_*son 7

你说得对,这个方法是在List类中定义的.但是,它很容易创建一个做同样事情的扩展方法.

public static void ForEach<T>(this IEnumerable<T> enumerable, Action<T> action)
{
    foreach (var t in enumerable)
        action(t);
}
Run Code Online (Sandbox Code Playgroud)

  • 更好的是,只需编写一个`foreach`循环并忘记扩展方法.我认为复制现有的C#功能没有任何意义,除非你试图将它暴露给不支持`foreach`语义的不同.N​​ET语言. (2认同)
  • 使用ForEach方法有一些优点,在​​这样的小例子中并不明显.在某些情况下,如果您需要采取的行动非常小,则可读性可能是一个优势. (2认同)