Niedawno natknąłem się na tę typową nieprawidłową operację Collection was modifiedw języku C # i choć w pełni ją rozumiem, wydaje się, że jest to tak częsty problem (Google, około 300 000 wyników!). Ale wydaje się również logiczną i prostą rzeczą modyfikowanie listy podczas jej przeglądania.
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"));
}
}
Niektóre osoby utworzą kolejną listę, aby ją powtarzać, ale to tylko unika problemu. Jakie jest prawdziwe rozwiązanie lub jaki jest tutaj rzeczywisty problem projektowy? Wydaje się, że wszyscy chcemy to zrobić, ale czy wskazuje to na błąd projektowy?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statementlinii
Iterator(działa zgodnie z opisem) i ListIterator(działa, jak chcesz). Oznaczałoby to, że w celu zapewnienia funkcjonalności iteratora dla szerokiego zakresu typów i implementacji kolekcji Iteratorjest wyjątkowo restrykcyjny (co się stanie, jeśli usuniesz węzeł w zbalansowanym drzewie? Ma to więcej next()sensu), ListIteratorponieważ ma większą moc, ponieważ ma mniej przypadków użycia.