Gần đây tôi đã chạy vào hoạt động không hợp lệ phổ biến này Collection was modified
trong C # và trong khi tôi hiểu nó đầy đủ, nó dường như là một vấn đề phổ biến như vậy (google, khoảng 300k kết quả!). Nhưng nó cũng có vẻ là một điều hợp lý và đơn giản để sửa đổi một danh sách trong khi bạn đi qua nó.
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"));
}
}
Một số người sẽ tạo một danh sách khác để lặp lại, nhưng đây chỉ là vấn đề. Giải pháp thực sự là gì, hoặc vấn đề thiết kế thực tế ở đây là gì? Tất cả chúng ta dường như muốn làm điều này, nhưng nó có phải là một lỗ hổng thiết kế không?
You consume an iterator from client code by using a For Each…Next (Visual Basic) or foreach (C#) statement
dòng
Iterator
(hoạt động như bạn mô tả) và ListIterator
(hoạt động như bạn mong muốn). Điều này sẽ chỉ rằng để cung cấp chức năng lặp qua một loạt các bộ sưu tập các loại và hiện thực, Iterator
là cực kỳ hạn chế (những gì sẽ xảy ra nếu bạn xóa một nút trong một cây cân bằng? Liệu next()
có ý nghĩa nữa), với ListIterator
việc mạnh hơn do có ít trường hợp sử dụng.