web-dev-qa-db-ja.com

C#:プレーンなforeachループに対するList <T> .ForEach(...)の利点はありますか?

なぜList<T>.ForEach(Action<T>)が存在するのか疑問に思います。

行うことの利点/違いはありますか:

elements.ForEach(delegate(Element element){ element.DoSomething(); });

以上

foreach(Element element in elements) { element.DoSomething();}

22

主な違いの1つは、基になるコレクションを変更できる.ForEachメソッドです。 foreach構文では、そうすると例外が発生します。その例を次に示します(見栄えは正確ではありませんが、機能します)。

static void Main(string[] args) {
    try {
        List<string> stuff = new List<string>();
        int newStuff = 0;

        for (int i = 0; i < 10; i++)
            stuff.Add(".");

        Console.WriteLine("Doing ForEach()");

        stuff.ForEach(delegate(string s) {
            Console.Write(s);

            if (++newStuff < 10)
                stuff.Add("+"); // This will work fine and you will continue to loop though it.
        });

        Console.WriteLine();
        Console.WriteLine("Doing foreach() { }");

        newStuff = 0;

        foreach (string s in stuff) {
            Console.Write(s);

            if (++newStuff < 10)
                stuff.Add("*"); // This will cause an exception.
        }

        Console.WriteLine();
    }
    catch {
        Console.WriteLine();
        Console.WriteLine("Error!");
    }

    Console.ReadLine();
}
34
Justin Long

それは より速い可能性が非常に高い (計算量の多いクランチやグラフィックアプリケーションを扱っていて、ほとんどのプロセッササイクルから)、デリゲートを直接渡すことができます。これは、場合によっては便利な場合があります。

list.ForEach(Console.WriteLine); // dumps the list to console.
14
Mehrdad Afshari

リスト内のアイテムに対してアクションを実行する方が便利な方法/省略形です。 MoreLinq は、IEnumerableを実装するすべての機能に対してこの機能を拡張します。

0