Недавно я столкнулся с этой распространенной недопустимой операцией Collection was modifiedв C #, и, хотя я полностью ее понимаю, кажется, что это такая распространенная проблема (Google, около 300 тыс. Результатов!). Но это также кажется логичным и простым, чтобы изменить список, пока вы просматриваете его.
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"));
}
}
Некоторые люди создадут другой список для итерации, но это только уклоняется от проблемы. Каково реальное решение или какова здесь проблема дизайна? Кажется, мы все хотим сделать это, но свидетельствует ли это о недостатке дизайна?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statementлинию
Iterator(работает, как вы описали) и ListIterator(работает, как вы хотите). Это указывает бы , что для того , чтобы обеспечить итератора функциональность в широком диапазоне типов коллекций и реализаций, Iteratorкрайне ограничительный (что происходит при удалении узла в сбалансированном дереве? Имеет ли имеет next()смысл больше), с ListIteratorбудучи более мощным из - за наличия менее случаи использования.