2009-12-24 27 views
3

可能重复:
Why is there not a ForEach extension method on the IEnumerable interface?为什么ForEach方法仅在列表<T>集合中?

首先,让我指定我指的List<T>方法,而不是C#关键字。对于List<T>集合上的Foreach方法,但没有其他集合/可枚举类型,特别是IEnumerable<T>,微软有什么推理?

我刚发现这个方法,发现它是非常好的语法来替换传统的foreach循环,每个对象只执行一行或两行方法。

看起来像创建一个扩展方法来执行相同的功能似乎相当简单。我想我正在考虑为什么MS做出这个决定,并基于这一点,如果我应该只是做一个扩展方法。

+0

谢谢。我在创建问题时看了一下,但没有看到dup。 –

回答

17

Eric Lippert已回复多次这个问题,包括on his blog

他的回应是,ForEach()是你明确使用它的副作用的东西 - 而LINQ很大程度上是为了定义对序列的投影和操纵的副作用免费API。

parallel loops用途之外,功能ForEach语法不会增加太多的表现力的方式,它是由于委托调用略小于正规foreach循环效率。

如果你真的想为IEnumerable<T>一个ForEach,它并不难写一个:

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; 
     } 
    } 
} 
+0

+1 - IEnumerable上的ForEach()比专业人士有更多的缺点 –

+1

另外,使用Select。它以LINQ-IS方式完成了几乎相同的事情:) –

3

在此之前扩展方法的写 - 它被添加在.NET 2.0。当时,没有办法将此作为任何可枚举的扩展添加 - 它必须是界面的一部分(我同意这不一定适合,因为枚举数可以是可以是无限长的,并且这将是坏)。我相信,当C#3发布时,他们可能会觉得LINQ通过Select可以提供一个简单的选择,同时更加清楚副作用。 Eric Lippert's blog post关于这个主题描述了副作用,以及为什么你会更详细地使用ForEach vs. foreach。

1

要婴儿床从Raymond Chen答案(谁是从埃里克Gunnerson那儿剽窃):

Every feature starts off at -100 points.

基本上,有人会写,并且这样做需要时间远离其他功能。由于您可以自己创建ForEach(),所以它永远不会优先于其他较不重要的功能。

ForEach()预先延伸方法。

相关问题