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 RemoveAtdö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 IsDeadbayrağı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, ObjectDisposedExceptionbu 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, IsDeadlisteyi 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.