我最近Collection was modified
在C#中遇到了这个常见的无效操作,尽管我完全理解它,但这似乎是一个常见的问题(谷歌,大约30万个结果!)。但这在您浏览列表时修改列表似乎是合乎逻辑且直接的事情。
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
由于具有更少的功能而更加强大用例。