Recientemente me encontré con esta operación inválida común Collection was modifieden C #, y aunque lo entiendo completamente, parece ser un problema tan común (¡Google, alrededor de 300 mil resultados!). Pero también parece ser lógico y sencillo modificar una lista mientras la revisas.
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"));
}
}
Algunas personas crearán otra lista para iterar, pero esto solo está esquivando el problema. ¿Cuál es la solución real o cuál es el problema de diseño real aquí? Todos parecemos querer hacer esto, pero ¿es indicativo de una falla de diseño?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statementlínea
Iterator(funciona como lo describiste) y ListIterator(funciona como deseas). Esto indicaría que, para proporcionar funcionalidad de iterador en una amplia gama de tipos de colecciones e implementaciones, Iteratores extremadamente restrictivo (¿qué sucede si elimina un nodo en un árbol equilibrado? next()Ya tiene sentido), ListIteratorsiendo más poderoso debido a que tiene menos casos de uso