为什么对List使用ForEach Linq扩展而不是使用IEnumerable的扩展?

26 浏览
0 Comments

为什么对List使用ForEach Linq扩展而不是使用IEnumerable的扩展?

这个问题已经有了答案:

可能重复:

为什么IEnumerable接口上没有ForEach扩展方法?

大家好,

我的问题是为什么Foreach扩展方法在List上定义而不是在IEnumerable上。我已经读过Eric Lippert的文章了,但问题是,如果这种方法如此糟糕,为什么它在List上存在呢?

admin 更改状态以发布 2023年5月22日
0
0 Comments

这是我在Microsoft Connect网站上发布的一个错误,如下链接中提到的那样,Microsoft已经在即将发布的.NET版本中修复了这个问题。

List.ForEach允许枚举修改后的List

这可能与答案没有直接关系,但我刚刚发现了一件有趣的事情。

ForEach,删除(有效)

List list = new List(){ 1, 2, 3, 4, 5, 6};
list.ForEach(x => {
    Console.WriteLine(x);
    list.Remove(x);
});

foreach,删除(崩溃)

// throws exception
foreach (var x in list)
{
    Console.WriteLine(x);
    list.Remove(x);
}

ForEach,插入(...)

// goes in infinite loop...
list.ForEach(x => {
    list.Add(1);
});

foreach,插入(崩溃)

// throws exception
foreach (var x in list)
{
    Console.WriteLine(x);
    list.Add(x);
}

因此,对于这里提到的可变性或不同的混淆层,我认为这是Visual Team的一个完全不完整的功能,因为如果修改集合,则枚举始终会导致问题。

尽管有争议,我仍然认为ForEach不应该允许修改,它纯粹用于枚举,无论是foreach(var item in x)语法还是x.ForEach(x=>{ })语法都没有区别。

我不同意Eric的看法,我认为BCL团队实现了IEnumerable上的这个功能,而list.ForEach是有问题的。

“为什么”是完全主观的,例如,Silverlight添加了复杂的哈希算法留下了MD5,而其他地方我们广泛使用MD5。它更多地取决于需求有多大,以及谁选择在框架中包括它或不包括它。

没有任何逻辑或哲学上的理由不在IEnumerable中拥有ForEach。我认为.NET将随着时间的推移改进这种缺失的问题。

0
0 Comments

List.ForEach()并不是一个扩展方法,它只是一个List上的方法。

它没有出现在LINQ(即Enumerable)中的主要原因之一是LINQ查询应该是无副作用的(这样,您可以多次执行查询,而不改变它们的结果),这使它们非常可组合。所有接受委托的LINQ操作都是针对Func的;它们中没有一个接受Action委托。

0