Недавно я столкнулся с этой распространенной недопустимой операцией 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
будучи более мощным из - за наличия менее случаи использования.