Muh*_*hid 11 .net c# linq ienumerable linq-to-objects
你好,
我的问题是为什么Foreach扩展方法是在List而不是IEnumreable上定义的.我已经阅读了Eric Lippert的文章,但关键是,如果有这样的方法,那么为什么它适用于List呢?
Mar*_*ade 13
List<T>.ForEach()不是一种扩展方法.这只是一种方法List<T>.
在LINQ(即Enumerable)中不可用的主要原因之一是LINQ查询应该没有副作用(因此您可以,例如,多次执行查询并获得相同的结果而不更改它们),这使它们非常可组合.接受委托的所有LINQ操作都是为了Func; 他们都不接受Action代表.
这是我在Microsoft Connect网站上发布的一个错误,微软已经在即将发布的.NET版中修复了它,如下面的链接中所述.
这可能与答案没有直接关系,但它对我刚刚发现的内容非常有趣.
ForEach,删除(工作)
List<int> list = new List<int>(){ 1, 2, 3, 4, 5, 6};
list.ForEach(x => {
Console.WriteLine(x);
list.Remove(x);
});
Run Code Online (Sandbox Code Playgroud)
foreach,删除(崩溃)
// throws exception
foreach (var x in list)
{
Console.WriteLine(x);
list.Remove(x);
}
Run Code Online (Sandbox Code Playgroud)
ForEach,插入(...)
// goes in infinite loop...
list.ForEach(x => {
list.Add(1);
});
Run Code Online (Sandbox Code Playgroud)
foreach,插入(崩溃)
// throws exception
foreach (var x in list)
{
Console.WriteLine(x);
list.Add(x);
}
Run Code Online (Sandbox Code Playgroud)
所以在这里谈论可变性或不同的混淆层等的任何人,我认为它是Visual Team完全一半实现的功能,因为如果修改了集合,枚举将总是导致问题.
尽管存在争论,我仍然看不出ForEach应该允许修改的原因,它纯粹用于枚举,并且它的foreach(x中的var项)语法或x.ForEach(x => {})语法没有区别.
我不同意Eric,我只是简单地看到BCL团队已经在IEnumerable以及list.ForEach上实现了这个功能.
"为什么"是完全主观的,例如,Silverlight添加了复杂的散列算法,并将MD5置于其他地方,我们广泛使用MD5.更多的是需要多少东西以及选择是否将其包含在框架中的人.
没有在IEnumerable中拥有ForEach的逻辑或哲学原因.有许多这样的缺点,我认为.NET会随着时间的推移而改进.
| 归档时间: |
|
| 查看次数: |
10954 次 |
| 最近记录: |