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

Jac*_*hea 5 .net c# collections

可能重复:
为什么IEnumerable接口上没有ForEach扩展方法?

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

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

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

LBu*_*kin 18

Eric Lippert多次回答这个问题,包括在他的博客上.

他的反应ForEach()是你明确使用它的副作用 - 而LINQ主要是为了定义序列上的投影和操作的副作用免费API.

除了并行循环之类的用法之外,函数ForEach语法并没有增加表达能力的方式,并且foreach由于委托调用,它的效率略低于常规循环.

如果你真的,真的想要一个ForEachfor 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,使用选择。它以类似 LINQ 的方式完成了几乎相同的事情:) (2认同)