Ich bin kürzlich auf diese häufig auftretende ungültige Operation Collection was modified
in C # gestoßen, und obwohl ich sie vollständig verstehe, scheint es sich um ein so häufig auftretendes Problem zu handeln (Google, ca. 300.000 Ergebnisse!). Es scheint aber auch logisch und unkompliziert zu sein, eine Liste zu ändern, während Sie sie durchgehen.
List<Book> myBooks = new List<Book>();
public void RemoveAllBooks(){
foreach(Book book in myBooks){
RemoveBook(book);
}
}
RemoveBook(Book book){
if(myBooks.Contains(book)){
myBooks.Remove(book);
if(OnBookEvent != null)
OnBookEvent(this, new EventArgs("Removed"));
}
}
Einige Leute werden eine andere Liste erstellen, um sie zu durchlaufen, aber dies umgeht nur das Problem. Was ist die wirkliche Lösung oder was ist das eigentliche Designproblem hier? Wir alle scheinen dies zu wollen , aber deutet dies auf einen Konstruktionsfehler hin?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
Linie
Iterator
(funktioniert wie beschrieben) und ListIterator
(funktioniert wie gewünscht). Dies würde darauf hinweisen, dass die Bereitstellung von Iteratorfunktionen für eine Vielzahl von Auflistungstypen und -implementierungen Iterator
äußerst restriktiv ist (was passiert, wenn Sie einen Knoten in einer ausgeglichenen Baumstruktur löschen? Ergibt keinen next()
Sinn mehr) und ListIterator
aufgrund der geringeren Leistung leistungsfähiger ist Anwendungsfälle.