Pertama-tama: terminologi. Jika Anda mengatakan "daftar sampah", orang akan berpikir Anda berbicara tentang pengumpul sampah. Sebut saja "daftar mati".
Seperti yang mungkin telah Anda temukan, maka pertanyaan Anda, Anda tidak dapat menghapus item dari koleksi saat Anda mengulanginya. Jika koleksi Anda adalah List<>
maka cara paling sederhana untuk menghapus item dari itu adalah:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Perhatikan bahwa Anda mengulangi mundur . Anda dapat menghapus item saat iterasi ke depan, tetapi lebih berantakan dan membutuhkan goto
. Anda tidak dapat melakukannya dengan foreach
.
Anda dapat melakukan penghapusan secara terpisah dari loop pembaruan Anda. Atau Anda dapat menggabungkannya ke dalam loop pembaruan Anda. Selalu lakukan RemoveAt
pada akhir loop - setelah titik itu dalam loop, list[i]
tidak dapat dianggap valid (itu menjadi valid lagi pada iterasi berikutnya).
Perhatikan, juga, bahwa setiap objek memiliki IsDead
benderanya sendiri (jika Anda menggunakan pola pembuangan, Anda dapat membuatnya IsDisposed
) - Anda sebenarnya tidak perlu mempertahankan "daftar mati" sama sekali.
Menggunakan bendera pada setiap item lebih disukai untuk kinerja, karena Anda menghindari harus mencari melalui daftar untuk melakukan penghapusan. Dan itu juga lebih baik untuk desain - itu berarti bahwa setiap objek dapat dengan mudah memeriksa apakah sudah mati - sehingga Anda tidak sengaja memanggil metode apa pun di atasnya (jika objek ini menerapkan pola sekali pakai, mereka dapat membuangObjectDisposedException
dalam kasus ini).
Jika Anda memiliki koleksi selain a List<>
, maka menghapus item yang mati dari koleksi itu mungkin masih melibatkan pembuatan daftar mati (karena penghapusan selama iterasi mungkin tidak mungkin). Menurut pendapat saya, lebih baik, lebih bijaksana secara desain, untuk membuat daftar mati tepat sebelum digunakan, dengan mengulangi koleksi yang mencari IsDead
bendera, daripada mencoba mempertahankan daftar ketika benda terbunuh.
Setelah Anda selesai dengan daftar yang mati, Anda harus Clear()
melakukannya, dan menyimpannya untuk menggunakannya kembali nanti.