为什么对List使用ForEach Linq扩展而不是使用IEnumerable的扩展?
为什么对List使用ForEach Linq扩展而不是使用IEnumerable的扩展?
这个问题已经有了答案:
可能重复:
大家好,
我的问题是为什么Foreach扩展方法在List上定义而不是在IEnumerable上。我已经读过Eric Lippert的文章了,但问题是,如果这种方法如此糟糕,为什么它在List上存在呢?
admin 更改状态以发布 2023年5月22日
这是我在Microsoft Connect网站上发布的一个错误,如下链接中提到的那样,Microsoft已经在即将发布的.NET版本中修复了这个问题。
这可能与答案没有直接关系,但我刚刚发现了一件有趣的事情。
ForEach,删除(有效)
Listlist = 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将随着时间的推移改进这种缺失的问题。