เมื่อเร็ว ๆ นี้ฉันได้พบกับการดำเนินการที่ไม่ถูกต้องทั่วไปCollection was modified
ใน C # และในขณะที่ฉันเข้าใจอย่างเต็มที่ดูเหมือนว่าจะเป็นปัญหาที่พบบ่อย (google ผลลัพธ์ประมาณ 300k!) แต่มันก็ดูเหมือนจะเป็นตรรกะและตรงไปตรงมาในการปรับเปลี่ยนรายการในขณะที่คุณทำมัน
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 ช่วงกว้างของประเภทคอลเลกชันและการใช้งานIterator
เป็นที่เข้มงวดมาก (เกิดอะไรขึ้นถ้าคุณลบโหนดในต้นไม้สมดุลหรือไม่next()
เข้าท่าอีกต่อไป) กับListIterator
การเป็นมีประสิทธิภาพมากขึ้นเนื่องจากมีน้อย ใช้กรณี