Sammlung wurde geändert; Die Enumeration führt möglicherweise keinen Fehler beim Entfernen eines ListItem aus einer LIstBox aus

8

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%     
Xaisoft 30.04.2009, 17:02
quelle

9 Antworten

17

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.

    
JaredPar 30.04.2009, 17:08
quelle
6

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%     
Daniel Brückner 30.04.2009 17:06
quelle
4

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.

    
Paul Sonier 30.04.2009 17:08
quelle
3

Wie in der anderen Antwort erwähnt, können Sie Elemente erst entfernen, wenn Sie die Iteration abgeschlossen haben. Vielleicht wird so etwas für dich am saubersten sein:

%Vor%     
mquander 30.04.2009 17:08
quelle
1

Sie können eine Sammlung nicht ändern, während Sie darüber iterieren. Entweder über eine Kopie iterieren oder für verwenden, iterieren in umgekehrter Richtung und entfernen, wie Sie gehen.

    
Arnshea C 30.04.2009 17:04
quelle
0

Beispiel zum Entfernen der ausgewählten Elemente. Hier werden nur die ausgewählten Indizes übernommen und entfernt.

%Vor%     
dhinesh 16.10.2010 13:56
quelle
0

Vielleicht ist das was du brauchst

%Vor%     
Naveen 05.07.2012 05:58
quelle
0

Dies könnte Ihnen helfen;

Entfernen:

%Vor%     
Ali Shahrokhi 01.02.2013 04:11
quelle
0

Das Problem, dem Sie gegenüberstehen, ist, dass Sie die Sammlung, die Sie durchgehen, nicht ändern können. Sie können dies lösen, indem Sie eine einzige linq verwenden:

%Vor%     
Luc 23.09.2015 17:51
quelle

Tags und Links