Her şeyden önce: terminoloji. "Çöp listesi" derseniz, insanlar çöp toplayıcı hakkında konuştuğunuzu düşüneceklerdir. Buna "ölü liste" diyelim.
Muhtemelen keşfettiğiniz gibi, bu nedenle sorunuz, bir koleksiyondan öğeleri yineleyerek kaldıramazsınız. Koleksiyonunuz bir List<>
öğe ise, öğeleri ondan kaldırmanın en basit yoludur:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Geriye doğru yinelediğinizi unutmayın . İleriye doğru devam ederken öğeleri kaldırabilirsiniz, ancak bu daha karışıktır ve a gerektirir goto
. İle yapamazsın foreach
.
Kaldırma işlemini güncelleme döngünüzden ayrı olarak yapabilirsiniz. Veya güncelleme döngünüzde birleştirebilirsiniz. Her zaman RemoveAt
döngünün sonunda - döngüdeki bu noktadan sonra list[i]
geçerli kabul edilemez (bir sonraki yinelemede tekrar geçerli olur).
Ayrıca, her nesnenin kendi IsDead
bayrağına sahip olduğunu unutmayın (elden çıkarma desenini kullanıyorsanız, bunu yapabilirsiniz IsDisposed
) - aslında bir "ölü liste" tutmanıza gerek yoktur.
Kaldırmak için listede arama yapmaktan kaçındığınız için her öğede bir bayrak kullanmak performans için tercih edilir. Ayrıca tasarım için de tercih edilir - her bir nesnenin ölü olup olmadığını kolayca kontrol edebileceği anlamına gelir - böylece yanlışlıkla herhangi bir yöntemi çağırmazsınız (bu nesneler tek kullanımlık desen uyguluyorsa, ObjectDisposedException
bu durumda atabilirler ).
A dışında bir koleksiyonunuz varsa List<>
, o koleksiyondan ölü öğelerin kaldırılması yine de bir ölü listenin oluşturulmasını içerebilir (yineleme sırasında kaldırma mümkün olmayabilir). Benim düşünceme göre, IsDead
listeyi nesneler öldürülürken korumaya çalışmak yerine, bayrakları aramak için koleksiyonu tekrarlayarak, ölü listeyi kullanılmadan hemen önce oluşturmak daha güzel, tasarım açısından daha iyi.
Ölü bir listeyle işiniz bittiğinde, listeyi Clear()
daha sonra yeniden kullanmak için saklamanız gerekir.