C# 为什么ForEach方法只在列表集合中?

C# 为什么ForEach方法只在列表集合中?,c#,.net,collections,C#,.net,Collections,可能重复: 首先,让我指定我引用的是List方法,而不是C关键字。Microsoft在列表集合上使用Foreach方法,但不使用其他集合/可枚举类型(特别是IEnumerable)的原因是什么 前几天我刚刚发现了这个方法,发现它是一种非常好的语法,可以替代传统的foreach循环,它在每个对象上只执行一行或两行方法 似乎创建一个执行相同功能的扩展方法是相当简单的。我想我正在研究MS为什么做出这个决定,以及基于这个决定我是否应该做一个扩展方法。已经多次回答了这个问题,包括 他的回答是,ForEa

可能重复:

首先,让我指定我引用的是List方法,而不是C关键字。Microsoft在列表集合上使用Foreach方法,但不使用其他集合/可枚举类型(特别是IEnumerable)的原因是什么

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

似乎创建一个执行相同功能的扩展方法是相当简单的。我想我正在研究MS为什么做出这个决定,以及基于这个决定我是否应该做一个扩展方法。

已经多次回答了这个问题,包括

他的回答是,ForEach是一种明确用于其副作用的东西,而LINQ主要是一种无副作用的API,用于定义序列上的投影和操作

除了像这样的用法之外,函数式ForEach语法在表达能力方面没有增加太多,而且由于委托调用,它的效率比常规ForEach循环稍低

如果你真的,真的想要一个IEnumerable的ForEach,写一个并不难:

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;
        }
    }
}

这是在扩展方法之前编写的-它是在.NET2.0中添加的。当时,没有办法将其添加为任何可枚举的扩展-它必须是接口的一部分,我同意这不一定适合,因为可枚举可以无限长,这将是不好的


我相信,当C3发布时,他们可能觉得LINQ通过Select提供了一个简单的替代方案,同时对副作用更加清楚。关于该主题,您还将更详细地描述副作用以及使用ForEach与ForEach的理由。

阅读帮助设计编译器的人的答案

要抄袭埃里克·冈纳森抄袭者的答案:

基本上,必须有人来编写它,这样做可以从其他一些功能中节省时间。因为您可以自己创建ForEach,所以它永远不会优先于其他不那么琐碎的特性


加上ForEach早于扩展方法。

+1-IEnumerable上的ForEach比pros有更多缺点。此外,请使用Select。它以一种类似于林肯的方式完成了几乎相同的事情:谢谢。我在创建问题时查看了,但没有看到dup。