Ändern Sie die Liste innerhalb der foreach-Schleife in C#
In C#-Versionen vor 4.0 führte der Versuch, eine Liste innerhalb einer foreach-Schleife zu ändern, zu einer Ausnahme. In .NET 4.0 wird diese Einschränkung jedoch aufgehoben.
Frage:
Was ist angesichts des folgenden Codes der beste Weg, ein Element zu einer Liste von Elementen hinzuzufügen, während eine foreach-Schleife verwendet wird, um über das verschachtelte Enumerable zu iterieren?
<code class="language-csharp">foreach (var item in Enumerable) { foreach (var item2 in item.Enumerable) { item.Add(new item2); // 这行代码有问题 } }</code>
Best Practices:
In foreach-Schleifen verwendete Sammlungen sind von Natur aus unveränderlich. Daher kann es während der Iteration nicht direkt geändert werden. Um die Liste sicher zu ändern, wird empfohlen, stattdessen eine herkömmliche for-Schleife zu verwenden.
Erklärung:
In der MSDN-Dokumentation heißt es, dass die foreach-Anweisung zum Durchlaufen einer Sammlung verwendet wird. Es fügt zwar nicht implizit Elemente zur Quellsammlung hinzu oder entfernt sie daraus, warnt aber auch davor, sich aufgrund möglicher Nebenwirkungen auf dieses Verhalten zu verlassen. Wenn Sie die Quellsammlung ändern müssen, empfiehlt sich die Verwendung einer for-Schleife.
Ausnahme für gleichzeitige Sammlung:
Der Blog-Beitrag von Paul Jackson, auf den in der Frage verwiesen wird, besagt, dass es in gleichzeitigen C#-Sammlungen zulässig ist, die Sammlung innerhalb einer foreach-Schleife zu ändern. Diese Ausnahme ergibt sich aus der Tatsache, dass gleichzeitige Sammlungen threadsicher sind und potenzielle Nebenwirkungen unterschiedlich behandeln. Daher gilt diese Regel nicht für gleichzeitige Sammlungen. Für normale Sammlungen wird weiterhin empfohlen, for
-Schleifen zu verwenden, um mögliche Probleme zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie füge ich Elemente sicher zu einer Liste hinzu, während ich mit einer Foreach-Schleife in C# iteriere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!