爲何IEnumerable上沒有ForEach擴展方法?

受到另外一個詢問缺乏Zip功能的問題的啓發: 框架

爲何Enumerable類中沒有ForEach擴展方法? 仍是在任 獲取ForEach方法的惟一類是List<> 。 有沒有理由錯過(表演)? this


#1樓

大多數LINQ擴展方法都返回結果。 ForEach不適合這種模式,由於它什麼都不返回。 spa


#2樓

在LINQ以前添加了ForEach方法。 若是添加ForEach擴展,因爲擴展方法約束,它將永遠不會爲List實例調用。 我認爲沒有添加它的緣由是不干擾現有的。 code

可是,若是你真的錯過這個小功能,你能夠推出本身的版本 ip

public static void ForEach<T>(
    this IEnumerable<T> source,
    Action<T> action)
{
    foreach (T element in source) 
        action(element);
}

#3樓

我一直想知道本身,這就是爲何我老是隨身攜帶這個: element

public static void ForEach<T>(this IEnumerable<T> col, Action<T> action)
{
    if (action == null)
    {
        throw new ArgumentNullException("action");
    }
    foreach (var item in col)
    {
        action(item);
    }
}

不錯的小擴展方法。 it


#4樓

在大多數狀況下,該語言中已包含一個foreach語句。 io

我不想看到如下內容: 編譯

list.ForEach( item =>
{
    item.DoSomething();
} );

代替: 擴展

foreach(Item item in list)
{
     item.DoSomething();
}

在大多數狀況下 ,後者更清晰,更容易閱讀,但輸入可能要長一些。

可是,我必須認可我在這個問題上改變了立場; 在某些狀況下,ForEach()擴展方法確實頗有用。

如下是語句和方法之間的主要區別:

  • 類型檢查:foreach在運行時完成,ForEach()在編譯時(Big Plus!)
  • 調用委託的語法確實要簡單得多:objects.ForEach(DoSomething);
  • ForEach()能夠被連接:雖然這種功能的邪惡/有用性能夠討論。

這些都是不少人在這裏提出的很好的觀點,我能夠看出爲何人們會錯過這個功能。 我不介意微軟在下一個框架迭代中添加標準的ForEach方法。


#5樓

若是您有F#(將在.NET的下一個版本中),您可使用

Seq.iter doSomething myIEnumerable

相關文章
相關標籤/搜索