Нещодавно я наткнувся на цю загальну недійсну операцію Collection was modifiedв C #, і хоча я її повністю розумію, здається, це така поширена проблема (google, близько 300 000 результатів!). Але також здається логічною і зрозумілою річ змінити список, поки ви проходите його.
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оскільки він є більш потужним через меншу кількість випадки використання.