C #: какое-либо преимущество List <T>.ForEach (...) над простым циклом foreach? - PullRequest
22 голосов
/ 17 декабря 2009

Мне интересно, почему существует List<T>.ForEach(Action<T>).

Есть ли какая-то выгода / разница в выполнении:

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

над

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

Ответы [ 3 ]

34 голосов
/ 18 декабря 2009

Одно ключевое отличие заключается в методе .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();
}
14 голосов
/ 17 декабря 2009

Это , скорее всего, будет быстрее (вы не должны выбирать одно из другого только из-за небольшого выигрыша в производительности, если только вы не имеете дело с вычислительно сложным вычислением чисел или графическим приложением, и вам не нужно максимально использовать процессорные циклы), и вы можете напрямую передавать делегатов в него, что может быть удобно в некоторых случаях:

list.ForEach(Console.WriteLine); // dumps the list to console.
0 голосов
/ 17 декабря 2009

Это более удобный способ / сокращение для выполнения действия над элементами в списке, MoreLinq расширяет эту функциональность для всех, кто реализует IEnumerable.

...