Wenn ich benutze:
var strings = new List<string> { "sample" };
foreach (string s in strings)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
Das Add
in den foreach
Würfen eine InvalidOperationException (Sammlung wurde geändert; Aufzählungsoperation wird möglicherweise nicht ausgeführt), die ich für logisch halte, da wir den Teppich unter unseren Füßen hervorziehen.
Wenn ich jedoch benutze:
var strings = new List<string> { "sample" };
strings.ForEach(s =>
{
Console.WriteLine(s);
strings.Add(s + "!");
});
Es schießt sich sofort in den Fuß, indem es eine Schleife ausführt, bis eine OutOfMemoryException ausgelöst wird.
Dies ist eine Überraschung für mich, da ich immer dachte, dass List.ForEach entweder nur ein Wrapper für foreach
oder für ist for
.
Hat jemand eine Erklärung für das Wie und Warum dieses Verhaltens?
(Inspiriert von der ForEach-Schleife für eine endlos wiederholte generische Liste )
foreach
oder für ist for
." Es könnte noch gebrauchen for
. Sie können dieselbe Aktion in einer for
Schleife ausführen und als Ergebnis dieselbe OutOfMemoryException generieren.