46

私は最近Windows8メトロに手を出し始めましたが、私の古い仲間の1人が行方不明になっているようです。

.ForEach()私は従来の構成よりもこの方法を使用する傾向がありforeach()、この方法が利用できないことにすぐに気づきました。たとえば、このコードはメトロアプリではコンパイルされません。

var list = new List<string>();

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

私はこれについての議論を見つけることができるかどうかを調べましたが、見つけることができませんでした。私はただ鈍感なのですか、それとも実際になくなったのですか?

4

3 に答える 3

43

それは確かになくなりました:

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


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

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

于 2012-04-24T13:58:57.903 に答える
19

含まれなくなった理由を理解するには、Microsoft の C# チームで働いている人による次の投稿をお読みください: http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach -vs-foreach.aspx

基本的には哲学です。「LINQ」機能は、関数型プログラミング パラダイムに大いに影響を受けており、ForEach 拡張機能はそれに直面して飛んでいます...貧弱な関数型スタイルを奨励しています。

詳細については、この回答も参照してください。

https://stackoverflow.com/a/529197/3043

于 2012-04-24T14:04:16.673 に答える
16

もちろん、別の方法として、自分で定義することもできます。

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

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

于 2012-04-24T14:00:56.643 に答える