web-dev-qa-db-ja.com

List <T> .ForEach()メソッドはなくなっていますか?

最近、Windows 8 Metroに手を出してみると、私の古い仲間の1人が行方不明になっているようです。

私は、従来の.ForEach()構文を使用するよりもforeach()メソッドを使用する傾向があり、このメソッドが利用できないことにすぐに気付きました。たとえば、次のコードはMetroアプリではコンパイルできません。

var list = new List<string>();

list.ForEach(System.Diagnostics.Debug.WriteLine);

これについてのディスカッションが見つかるかどうかを調べましたが、見つけることができませんでした。私はただ鈍感なのか、それとも実際になくなっているのか?

46
Robaticus

確かになくなっています:

List <T> .ForEachがMetroスタイルアプリから削除されました。メソッドは単純に見えますが、リストがForEachに渡されたメソッドによって変更されると、いくつかの潜在的な問題があります。代わりに、単にforeachループを使用することをお勧めします。


ウェス・ハガード| .NET Frameworkチーム(BCL)| http://blogs.msdn.com/b/bclteam/

ただし、非常に奇妙なことに、それは documentation で表示されます。このメソッドでは、Windowsストアアプリの.NET(以前のMetroスタイルアプリの.NET)でこのメソッドがサポートされていないことがどこにも示されていません。 。おそらく、これはドキュメンテーションチームの一部の見落としにすぎません。

43
BoltClock

なぜそれが含まれなくなるのかを理解するには、MicrosoftのC#チームで働く誰かがこの投稿を読んでください: http://blogs.msdn.com/b/ericlippert/archive/2009/05 /18/foreach-vs-foreach.aspx

基本的に、それは哲学です。 "LINQ"機能は、関数型プログラミングパラダイムに非常に触発されており、ForEach拡張機能はそれに直面して飛んでいます...関数型の貧弱なスタイルを助長しています。

18
Joel Coehoorn

もちろん、自分で定義することもできます:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
    foreach(T item in enumeration)
    {
        action(item);
        yield return item;
    }
}

クレジット: IEnumerable <T>のforeachに相当するLINQ

(注:重複ではありません)

16
yamen