web-dev-qa-db-ja.com

Foreach句を使用したラムダ式

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

[〜#〜]編集[〜#〜]

参考までに、これはコメントで参照されたエリックのブログ投稿です

http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx

[〜#〜] orig [〜#〜]

好奇心はもっとあると思いますが、C#仕様のサバントのためのものです...

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

最初に結果を変換する必要があります。リスト... 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));
50
Eoin Campbell

なんて驚くべき偶然でしょう。この質問についてブログ記事を書いたところです。それ になります 5月18日に公開されました 。私たち(またはあなた!)がこれを実行できなかった技術的な理由はありません。そうでない理由は哲学的です。私の議論については来週の私のブログを参照してください。

57
Eric Lippert

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

なぜそれが組み込みの拡張メソッドとして含まれていないのか本当にわかりません:

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

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);
    }
}
14
LukeH