Di recente mi sono imbattuto in questa operazione non valida comune Collection was modified
in C #, e mentre la capisco pienamente, sembra essere un problema così comune (Google, circa 300k risultati!). Ma sembra anche essere una cosa logica e semplice modificare un elenco mentre lo attraversi.
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"));
}
}
Alcune persone creeranno un altro elenco per scorrere, ma questo sta solo schivando il problema. Qual è la vera soluzione o qual è il vero problema di progettazione qui? Sembriamo tutti voler farlo, ma è indicativo di un difetto di design?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
linea
Iterator
(funziona come hai descritto) e ListIterator
(funziona come desideri). Ciò significherebbe che, al fine di fornire funzionalità iteratore su una vasta gamma di tipi e implementazioni di raccolte, Iterator
è estremamente restrittivo (cosa succede se si elimina un nodo in un albero bilanciato? Ha next()
più senso), ListIterator
essendo più potente a causa della minore casi d'uso.