为什么只有List <t>集合上的ForEach方法?</t>

时间:2009-12-24 16:44:31

标签: c# .net collections

  

可能重复:
  Why is there not a ForEach extension method on the IEnumerable interface?

首先,让我指出我引用List<T>方法而不是C#关键字。微软在List<T>集合上使用Foreach方法但没有其他集合/可枚举类型,特别是IEnumerable<T>的原因是什么?

前几天我刚刚发现了这个方法,发现它是替换传统foreach循环的非常好的语法,传统的foreach循环只对每个对象执行一行或两行方法。

创建一个执行相同功能的扩展方法似乎相当简单。我想我正在考虑为什么MS做出这个决定并基于这个,如果我应该做一个扩展方法。

4 个答案:

答案 0 :(得分:18)

Eric Lippert已多次回答此问题,包括on his blog

他的回答是ForEach()是你明确用于其副作用的东西 - 而LINQ主要是为了定义对序列的投射和操作的副作用免费API。

parallel loops之类的用途之外,功能性ForEach语法在表达能力方面并没有太多增加,并且它的效率略低于常规foreach循环委托调用。

如果你确实想要ForEach IEnumerable<T>,那么写一个并不难:

public static class ForEachExtension
{
    public static void ForEach<T>( this IEnumerable<T> seq, Action<T> action )
    {
        foreach( var item in seq ) 
            action( item );
    }

    // Here's a lazy, streaming version:
    public static IEnumerable<T> ForEachLazy<T>( this IEnumerable<T> seq, Action<T> action )
    {
        foreach( var item in seq )
        {
            action( item );
            yield return item;
        }
    }
}

答案 1 :(得分:6)

答案 2 :(得分:3)

在扩展方法之前编写了这个 - 它是在.NET 2.0中添加的。当时,没有办法将其添加为任何可枚举的扩展 - 它必须是界面的一部分(我同意不一定适合,因为可以使用 无限长的枚举数,这会很糟糕。)

我相信,当C#3发布时,他们可能会觉得LINQ,通过Select,是一个简单的选择,同时更清楚副作用。关于此主题的Eric Lippert's blog post描述了副作用,以及为何更详细地使用ForEach与foreach的原因。

答案 3 :(得分:1)

来自Raymond Chen(来自Eric Gunnerson的人)的答案:

  

Every feature starts off at -100 points.

基本上,有人必须写它,这样做需要时间远离其他一些功能。由于您可以自己创建ForEach(),因此它永远不会优先于其他不那么微不足道的功能。

Plus ForEach()早于扩展方法。