Saya baru-baru ini berlari ke operasi umum yang tidak valid ini Collection was modified
di C #, dan sementara saya memahaminya sepenuhnya, tampaknya menjadi masalah umum (google, sekitar 300k hasil!). Tetapi tampaknya juga merupakan hal yang logis dan mudah untuk memodifikasi daftar saat Anda menjalaninya.
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"));
}
}
Beberapa orang akan membuat daftar lain untuk diulangi, tetapi ini hanya menghindari masalah. Apa solusi yang sebenarnya, atau apa masalah desain yang sebenarnya di sini? Kita semua tampaknya ingin melakukan ini, tetapi apakah ini menunjukkan cacat desain?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
baris
Iterator
(berfungsi seperti yang Anda gambarkan) dan ListIterator
(berfungsi sesuai keinginan). Ini akan menunjukkan bahwa untuk menyediakan fungsionalitas iterator pada berbagai jenis koleksi dan implementasi, Iterator
sangat membatasi (apa yang terjadi jika Anda menghapus simpul di pohon seimbang? Apakah next()
masuk akal lagi), dengan ListIterator
menjadi lebih kuat karena memiliki lebih sedikit gunakan kasing.