可能重复:
Why is there not a ForEach extension method on the IEnumerable interface?
首先,让我指出我引用List<T>
方法而不是C#关键字。微软在List<T>
集合上使用Foreach方法但没有其他集合/可枚举类型,特别是IEnumerable<T>
的原因是什么?
前几天我刚刚发现了这个方法,发现它是替换传统foreach循环的非常好的语法,传统的foreach循环只对每个对象执行一行或两行方法。
创建一个执行相同功能的扩展方法似乎相当简单。我想我正在考虑为什么MS做出这个决定并基于这个,如果我应该做一个扩展方法。
答案 0 :(得分:18)
Eric Lippert已多次回答此问题,包括on his blog。
他的回答是ForEach()
是你明确用于其副作用的东西 - 而LINQ主要是为了定义对序列的投射和操作的副作用免费API。
在parallel loops之类的用途之外,功能性ForEach
语法在表达能力方面并没有太多增加,并且它的效率略低于常规foreach
循环委托调用。
如果你确实想要ForEach
IEnumerable<T>
,那么写一个并不难:
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;
}
}
}
答案 1 :(得分:6)
答案 2 :(得分:3)
在扩展方法之前编写了这个 - 它是在.NET 2.0中添加的。当时,没有办法将其添加为任何可枚举的扩展 - 它必须是界面的一部分(我同意不一定适合,因为可以使用 无限长的枚举数,这会很糟糕。)
我相信,当C#3发布时,他们可能会觉得LINQ,通过Select,是一个简单的选择,同时更清楚副作用。关于此主题的Eric Lippert's blog post描述了副作用,以及为何更详细地使用ForEach与foreach的原因。
答案 3 :(得分:1)
来自Raymond Chen(来自Eric Gunnerson的人)的答案:
基本上,有人必须写它,这样做需要时间远离其他一些功能。由于您可以自己创建ForEach()
,因此它永远不会优先于其他不那么微不足道的功能。
Plus ForEach()
早于扩展方法。