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

474

受另一个关于缺少Zip函数的问题启发:

为什么IEnumerable接口上没有ForEach扩展方法,或者其他地方也没有呢?唯一拥有ForEach方法的类是List<>。是否有某些原因导致它缺失,比如性能问题?


很可能就像之前的帖子所暗示的那样,在C#和VB.NET(以及许多其他语言)中,foreach是作为一种语言关键字支持的。大多数人(我自己也包括在内)只会根据需要和适当情况编写自己的foreach。 - chrisb
2
相关问题在此,附上官方答案链接:https://dev59.com/_nRA5IYBdhLWcg3wsgLq - Benjol
1
请参见https://dev59.com/GHVC5IYBdhLWcg3wtzyt。 - goodeye
1
我认为一个非常重要的点是,foreach循环更容易被发现。如果你使用.ForEach(...),当你浏览代码时很容易错过这个点。当你遇到性能问题时,这一点变得很重要。当然,.ToList()和.ToArray()也有同样的问题,但它们的使用方式略有不同。另一个原因可能是,在.ForEach中更常见的是修改源列表(例如删除/添加元素),所以它将不再是一个“纯”查询。 - Daniel Bişar
当调试并行化代码时,我经常尝试将Parallel.ForEach换成Enumerable.ForEach,只发现后者根本不存在。在这里,C#错过了一个让事情变得容易的技巧。 - Colonel Panic
显示剩余4条评论
21个回答

-1

目前还没有人指出,ForEach<T>会在编译时进行类型检查,而foreach关键字则是在运行时检查。

在代码中使用了两种方法进行重构后,我更喜欢使用.ForEach,因为我必须寻找测试失败/运行时失败来找到foreach问题。


5
这真的是这样吗?我无法看出foreach有什么较少的编译时检查。当然,如果您的集合是非泛型的IEnumerable,则循环变量将是一个“object”,但对于假设的ForEach扩展方法也是如此。 - Richard Poole
1
这在被接受的答案中提到过。然而,它是错误的(Richard Poole 以上是正确的)。 - Jim Balter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接