Sammlung wurde geändert: So besiegen Sie den Fehler beim Durchlaufen von Sammlungen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Lernen Sie den Fehler kennen, der Code millionenfach zerstört hat



Haben Sie jemals eine einfache foreach-Schleife geschrieben, das Programm gestartet, und plötzlich – bumm! – erscheint eine InvalidOperationException mit der erschreckenden Meldung: "Collection was modified; enumeration operation may not execute"? Wenn ja, sind Sie nicht allein. Diese Frage auf Stack Overflow hat tausende Aufrufe gesammelt und wird sowohl von Anfängern als auch von erfahrenen Entwicklern gestellt.



In diesem Artikel analysieren wir, warum dieser Fehler auftritt, wie man ihn reproduziert, und vor allem – wie man ihn vermeidet. Wir betrachten drei bewährte Methoden, schreiben echten C#-Code und geben Ihnen einen klaren Aktionsplan. Los geht's!



Was ist "Collection was modified"? Fehleranalyse



Der Fehler Collection was modified; enumeration operation may not execute ist eine Ausnahme vom Typ InvalidOperationException, die ausgelöst wird, wenn Sie versuchen, eine Sammlung (ein Element hinzuzufügen, zu entfernen oder zu ersetzen) während ihrer Durchlaufung mit foreach oder einem anderen Enumerator (IEnumerator) zu ändern.



Stellen Sie sich vor, Sie lesen ein Buch, während jemand gleichzeitig Seiten daraus herausreißt. Sie verlieren den Faden und wissen nicht, was Sie als Nächstes lesen sollen. Genauso ergeht es dem Enumerator: Er weiß nicht, wie er fortfahren soll, wenn sich die Sammlung während des Durchlaufs ändert.



Wie sieht der Code aus, der den Fehler verursacht?

Hier ist ein klassisches Beispiel, das garantiert zu einem Fehler führt:



List<string> fruits = new List<string> { "apple", "banana", "cherry", "date" };

foreach (var fruit in fruits){ if (fruit == "banana") { fruits.Remove(fruit); // Fehler! Collection was modified }}


Starten Sie diesen Code – und Sie erhalten eine InvalidOperationException in der zweiten Iteration. Warum? Weil foreach einen internen Enumerator verwendet, der Änderungen an der Sammlung während des Durchlaufs blockiert.



Warum passiert das? Ein Blick unter die Haube von C#



Wenn Sie foreach schreiben, wandelt der C#-Compiler dies in einen Aufruf der Methode GetEnumerator() um. Diese Methode gibt ein IEnumerator-Objekt zurück, das den Zustand des Durchlaufs speichert (aktueller Index, Version der Sammlung). Jedes Mal, wenn die Sammlung geändert wird (über Add, Remove, Clear usw.), wird ihr interner Versionszähler erhöht. Der Enumerator überprüft diese Version bei jedem Schritt. Stimmt sie nicht überein, wird eine Ausnahme ausgelöst.



Dies dient dem Schutz vor undefiniertem Verhalten. Stellen Sie sich vor, Sie entfernen ein Element aus der Mitte einer Liste: Die Indizes aller nachfolgenden Elemente verschieben sich, und der Enumerator könnte ein Element überspringen oder dasselbe Element zweimal verarbeiten. Die .NET-Entwickler haben entschieden, dass es besser ist, eine Ausnahme auszulösen, als einen unbemerkten logischen Fehler zuzulassen.



Top-3-Methoden zur Vermeidung des Fehlers "Collection was modified"



Nachdem wir den Fehler nun kennen, lassen Sie uns besprechen, wie wir ihn besiegen. Es gibt drei Hauptansätze, die jeweils für unterschiedliche Situationen geeignet sind.



Methode 1: Kopieren der Sammlung vor dem Durchlauf

Die einfachste und sicherste Methode ist, eine Kopie der Sammlung zu erstellen und diese zu durchlaufen, während die Änderungen am Original vorgenommen werden.



List<string> fruits = new List<string> { "apple", "banana", "cherry", "date" };

// Erstellen einer Kopie der Liste zum Durchlaufenforeach (var fruit in fruits.ToList()) // oder new List<string>(fruits){ if (fruit == "banana") { fruits.Remove(fruit); // Jetzt ist dies sicher }}

Console.WriteLine(string.Join(", ", fruits)); // Ausgabe: apple, cherry, date


Vorteile: Einfachheit, Lesbarkeit, geeignet für kleine Sammlungen.
Nachteile: Erfordert zusätzlichen Speicher, kann bei großen Listen langsam sein.



Tipp: Me

Blogs

Buchempfehlungen