2009-12-24 24 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()預先延伸方法。

相關問題