ก่อนอื่น: คำศัพท์ ถ้าคุณพูดว่า "รายการขยะ" ผู้คนจะคิดว่าคุณกำลังพูดถึงตัวเก็บขยะ ลองเรียกมันว่า "รายการที่ตายแล้ว"
ตามที่คุณอาจค้นพบดังนั้นคำถามของคุณคุณไม่สามารถลบรายการออกจากคอลเลกชันในขณะที่คุณทำการวนซ้ำ หากคอลเล็กชันของคุณเป็นวิธีList<>
ที่ง่ายที่สุดในการลบรายการออกจากคือ:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
โปรดทราบว่าคุณย้ำไปข้างหลัง คุณสามารถลบรายการในขณะที่วนไปข้างหน้า แต่ก็ Messier goto
และต้องใช้ foreach
คุณไม่สามารถทำมันได้ด้วย
คุณสามารถทำการลบแยกจากลูปการอัพเดตของคุณ หรือคุณสามารถรวมมันเข้าไปในลูปการอัปเดตของคุณ ทำRemoveAt
ที่ส่วนท้ายของลูปเสมอ - หลังจากจุดนั้นในลูปlist[i]
ไม่สามารถพิจารณาว่าใช้ได้ (มันจะใช้ได้อีกครั้งในการทำซ้ำครั้งถัดไป)
โปรดทราบว่าแต่ละวัตถุมีการIsDead
ตั้งค่าสถานะของตนเอง(ถ้าคุณใช้รูปแบบการกำจัดคุณสามารถทำได้IsDisposed
) - คุณไม่จำเป็นต้องรักษา "รายการที่ตายแล้ว" เลย
การใช้การตั้งค่าสถานะในแต่ละรายการจะดีกว่าสำหรับประสิทธิภาพเนื่องจากคุณไม่ต้องค้นหาในรายการเพื่อทำการลบ และก็ยังเป็นที่นิยมสำหรับการออกแบบ - มันหมายความว่าแต่ละวัตถุที่สามารถตรวจสอบถ้ามันจะตาย - เพื่อให้คุณไม่ได้ตั้งใจโทรหาวิธีการใด ๆ กับมัน (ถ้าวัตถุเหล่านี้มีการดำเนินการรูปแบบที่ใช้แล้วทิ้งพวกเขาจะโยนObjectDisposedException
ในกรณีนี้)
หากคุณมีคอลเล็กชันนอกเหนือจาก a List<>
ดังนั้นการลบไอเท็มที่ตายแล้วออกจากคอลเล็กชันนั้นอาจยังเกี่ยวข้องกับการสร้างรายการที่ตายแล้ว (เนื่องจากการลบในระหว่างการทำซ้ำอาจไม่สามารถทำได้) ในความคิดของฉันมันดีกว่าการออกแบบเพื่อสร้างรายการตายก่อนที่มันจะถูกใช้โดยวนซ้ำคอลเล็กชันที่ค้นหาIsDead
ธงแทนที่จะพยายามรักษารายการเมื่อวัตถุถูกฆ่า
เมื่อคุณเสร็จสิ้นรายการที่ตายแล้วคุณควรClear()
ใช้แล้วเก็บไว้รอบ ๆ เพื่อนำมาใช้อีกครั้งในภายหลัง