Recentemente, eu corri para essa operação inválida comum Collection was modified
em C # e, embora eu a compreenda completamente, parece ser um problema tão comum (google, cerca de 300k resultados!). Mas também parece uma coisa lógica e direta modificar uma lista enquanto você a percorre.
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"));
}
}
Algumas pessoas criarão outra lista para percorrer, mas isso está apenas evitando o problema. Qual é a solução real ou qual é o problema de design real aqui? Todos nós parecemos querer fazer isso, mas isso é indicativo de uma falha de design?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
linha
Iterator
(funciona como você descreveu) e ListIterator
(funciona como você deseja). Isso indicaria que, para fornecer funcionalidade do iterador em uma ampla variedade de tipos e implementações de coleções, Iterator
é extremamente restritivo (o que acontece se você excluir um nó em uma árvore balanceada? Faz next()
mais sentido), ListIterator
sendo mais poderoso por ter menos casos de uso.