J'ai récemment rencontré cette opération invalide courante Collection was modified
en C #, et même si je la comprends parfaitement, cela semble être un problème si courant (google, environ 300 000 résultats!). Mais il semble également être une chose logique et simple de modifier une liste pendant que vous la parcourez.
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"));
}
}
Certaines personnes créeront une autre liste à parcourir, mais cela évite simplement le problème. Quelle est la vraie solution, ou quel est le véritable problème de conception ici? Nous semblons tous vouloir le faire, mais cela indique-t-il un défaut de conception?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
ligne
Iterator
(fonctionne comme vous l'avez décrit) et ListIterator
(fonctionne comme vous le souhaitez). Cela indiquerait que pour fournir des fonctionnalités d'itérateur sur un large éventail de types de collections et d'implémentations, il Iterator
est extrêmement restrictif (que se passe-t-il si vous supprimez un nœud dans une arborescence équilibrée? Cela a next()
plus de sens), avec ListIterator
plus de puissance car moins cas d'utilisation.