Ich habe zwei ListBoxen, lstAvailableColors und lstSelectedColors. Zwischen jeder Listbox befinden sich zwei Schaltflächen, Hinzufügen und Entfernen. Wenn eine Farbe oder Farben in lstAvailableColors ausgewählt und auf die Schaltfläche Hinzufügen geklickt wird, möchte ich sie aus lstAvailableColors entfernen und sie in lstSelectedColors anzeigen. Wenn Farben in LstSelectedColors ausgewählt werden und wenn auf die Schaltfläche Entfernen geklickt wird, möchte ich die Farben aus LstSelectedColors außerdem entfernen und sie zu LstAvailableColors hinzufügen. Wenn ich das tue, erhalte ich den folgenden Fehler, wenn es das Einzelteil entfernt:
Sammlung wurde geändert; Aufzählungsoperation kann nicht ausgeführt werden.
Hier ist der Code für die Schaltfläche "Hinzufügen" und die Schaltfläche "Entfernen":
Hinzufügen:
%Vor%Entfernen:
%Vor%Es ist nicht möglich, eine Sammlung zu ändern, während Sie sie in .Net auflisten. Sie müssen Ihre Aufzählung trennen und Code in verschiedene Blöcke entfernen. Hier ist eine kurze Probe, wie man das ohne LINQ macht
%Vor%Und hier ist eine kürzere Version mit LINQ
%Vor%BEARBEITEN
Die LINQ-Version funktioniert in zwei Teilen. Der erste Teil ist die erste Zeile, die die aktuell ausgewählten Artikel findet und den Wert in List<ListItem>
speichert. Es ist sehr wichtig, dass die Zeile den Aufruf von .ToList () enthält, da dies dazu führt, dass die Abfrage sofort ausgeführt wird oder verzögert ausgeführt wird.
Die nächsten zwei Zeilen durchlaufen jeden ausgewählten Wert und entfernen ihn oder fügen ihn zur entsprechenden Liste hinzu. Da die ausgewählte Liste bereits gespeichert ist, listen wir die Sammlung nicht mehr auf, wenn wir sie ändern.
Sie können eine Auflistung nicht ändern, während Sie einen Enumerator für diese Sammlung verwenden, was die jeweilige Anweisung tut.
Sie müssen die Daten mit einer normalen for-Schleife durchlaufen und dann können Sie die Auflistung ändern, aber Sie müssen vorsichtig sein, den aktuellen Index korrekt zu aktualisieren, wenn Sie Elemente einfügen oder entfernen. Wenn Sie nur Elemente hinzufügen oder entfernen und keine einfügen, wird die Iteration vom letzten zum ersten Element durchgeführt.
%Vor%Sie können eine Sammlung, an der Sie gerade arbeiten, nicht ändern. Im Allgemeinen ist es eine gute Lösung für diese Art von Problem, eine leere Sammlung zu erstellen und in Ihrem Iterator alle Elemente zu kopieren, die Sie NICHT entfernen möchten. Ersetzen Sie nach Abschluss der Iteration die ursprüngliche Sammlung durch Ihre neue Sammlung.
Tags und Links .net c# ienumerable