13 Stimmen

Entfernen von Objekten aus einer Enumerable-Sammlung in einer Schleife

Duplizieren Sie

Ändern einer Sammlung beim Iterieren durch die Sammlung


Hat jemand ein nettes Muster, damit ich um die Unfähigkeit, Objekte zu entfernen, während ich Schleife durch eine aufzählbare Sammlung (z. B. eine IList oder KeyValuePairs in einem Wörterbuch) erhalten

Das folgende Beispiel schlägt fehl, da es die Liste, die während der foreach-Aufzählung aufgezählt wird, modifiziert

foreach (MyObject myObject in MyListOfMyObjects)
{
     if (condition) MyListOfMyObjects.Remove(myObject);
}

In der Vergangenheit habe ich zwei Methoden angewandt.

Ich habe die foreach-Schleife durch eine umgekehrte for-Schleife ersetzt (um die Indizes nicht zu ändern, über die ich eine Schleife mache, wenn ich ein Objekt entferne).

Ich habe auch versucht, eine neue Sammlung von Objekten zu speichern, die innerhalb der Schleife zu entfernen sind, und dann eine Schleife durch diese Sammlung zu ziehen und die Objekte aus der ursprünglichen Sammlung zu entfernen.

Diese funktionieren gut, aber weder fühlt sich schön, und ich habe mich gefragt, ob jemand eine bessere Lösung gefunden hat. elegant Lösung des Problems

0 Stimmen

Ich scheine meinen eigenen Beitrag nicht schließen zu können, da SO denkt, dass ich versuche, über ihn abzustimmen. Ich freue mich, wenn das jemand anderes tut.

0 Stimmen

Das ist kein Problem. Ich verbringe mehrere Minuten damit, SO zu suchen, bevor ich eine Frage stelle. An die ursprüngliche Frage erinnere ich mich, aber sie war nicht sehr gut betitelt. Ich habe sie bearbeitet, so dass sie in Zukunft leichter zu finden sein sollte: Wie ändert oder löscht man Elemente aus einer aufzählbaren Sammlung, während man sie in C# durchläuft?

1voto

Richard Watson Punkte 11

Ich habe ein Wörterbuch und möchte über alle Werte verfügen. Wenn jeder Wert entsorgt wird, entfernt er sich selbst aus dem Wörterbuch, wodurch das von Ihnen beschriebene Problem entsteht. Ich habe das Folgende getan:

foreach (var o in dictionary.Values.ToList())
{
  o.Dispose();
}

0voto

DC. Punkte 11

Ich weiß, dass das jetzt vielleicht tot ist, aber ich mache das immer so:

foreach (MyObject myObject in MyListOfMyObjects)
{

if (Bedingung) MyListOfMyObjects.Remove(myObject);

Pause;

}

Das Objekt wird entfernt und die Schleife wird beendet.

0 Stimmen

Was geschieht, wenn mehr als ein Objekt die Bedingung erfüllt?

0 Stimmen

@DC Keine Sorge, dass es tot ist, ich bin immer daran interessiert, aber Jasons Kommentar ist berechtigt. Die Unterbrechung ist nur gültig, wenn nur ein einziges Element geändert werden soll. Trotzdem vielen Dank für Ihren Beitrag.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X