51

重複の可能性:
IEnumerableインターフェイスにForEach拡張メソッドがないのはなぜですか?

編集

参考までに、ericがコメントで言及したブログ投稿は次のとおりです。

https://ericlippert.com/2009/05/18/foreach-vs-foreach/

ORIG

私が思うにもっと好奇心がありますが、C#仕様のサバントのためのものです...

ForEach()句がIQueryable / IEnumerable結果セットで使用できない(または使用できない)のはなぜですか...

最初に結果をToList()またはToArray()に変換する必要があります。おそらく、C#がIEnumerablesとIEnumerablesを繰り返す方法には技術的な制限があります。リスト...それはIEnumerables/IQuerableコレクションの遅延実行と関係がありますか。例えば

var userAgentStrings = uasdc.UserAgentStrings
    .Where<UserAgentString>(p => p.DeviceID == 0 && 
                            !p.UserAgentString1.Contains("msie"));
//WORKS            
userAgentStrings.ToList().ForEach(uas => ProcessUserAgentString(uas));         

//WORKS
Array.ForEach(userAgentStrings.ToArray(), uas => ProcessUserAgentString(uas));

//Doesn't WORK
userAgentStrings.ForEach(uas => ProcessUserAgentString(uas));
4

1 に答える 1

15

ForEachの拡張メソッドを書くことは完全に可能ですIEnumerable<T>

組み込みの拡張メソッドとして含まれていない理由がよくわかりません。

  • おそらく、LINQとその前にForEach既に存在していたためです。List<T>Array
  • おそらく、foreachループを使用してシーケンスを反復するのは簡単だからです。
  • たぶん、機能的/ LINQyであると十分に感じられなかったからです。
  • チェーン化できないからかもしれません。(アクションを実行した後に各アイテムの連鎖可能なバージョンを作成するのは簡単ですyieldが、その動作は特に直感的ではありません。)

public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    if (source == null) throw new ArgumentNullException("source");
    if (action == null) throw new ArgumentNullException("action");

    foreach (T item in source)
    {
        action(item);
    }
}
于 2009-05-13T16:42:00.837 に答える