[〜#〜]編集[〜#〜]
参考までに、これはコメントで参照されたエリックのブログ投稿です
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));
なんて驚くべき偶然でしょう。この質問についてブログ記事を書いたところです。それ になります 5月18日に公開されました 。私たち(またはあなた!)がこれを実行できなかった技術的な理由はありません。そうでない理由は哲学的です。私の議論については来週の私のブログを参照してください。
IEnumerable<T>
のForEach
拡張メソッドを書くことは完全に可能です。
なぜそれが組み込みの拡張メソッドとして含まれていないのか本当にわかりません:
ForEach
はList<T>
とArray
にすでに存在していたためでしょう。foreach
ループを使用するのは十分に簡単だからです。yield
sする連鎖可能なバージョンを作成するのは簡単ですが、その動作は特に直感的ではありません。)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);
}
}