Tout d'abord: la terminologie. Si vous dites "liste des ordures", les gens penseront que vous parlez du ramasse-miettes. Appelons cela la "liste morte".
Comme vous l'avez probablement découvert, d'où votre question, vous ne pouvez pas supprimer des éléments d'une collection pendant que vous parcourez celle-ci. Si votre collection est une, List<>
la façon la plus simple de supprimer des éléments est:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Notez que vous répétez en arrière . Vous pouvez supprimer des éléments tout en itérant vers l'avant, mais c'est plus compliqué et nécessite un goto
. Vous ne pouvez pas le faire avec foreach
.
Vous pouvez soit effectuer la suppression séparément de votre boucle de mise à jour. Ou vous pouvez le fusionner dans votre boucle de mise à jour. Faites toujours le RemoveAt
à la fin de la boucle - après ce point de la boucle, list[i]
ne peut pas être considéré comme valide (il redevient valide à la prochaine itération).
Notez également que chaque objet a son propre IsDead
indicateur (si vous utilisez le modèle d'élimination, vous pouvez le créer IsDisposed
) - vous n'avez pas du tout besoin de maintenir une "liste morte".
L'utilisation d'un indicateur sur chaque élément est préférable pour les performances, car vous évitez d'avoir à parcourir la liste pour effectuer la suppression. Et il est également préférable pour la conception - cela signifie que chaque objet peut facilement vérifier s'il est mort - afin de ne pas appeler accidentellement de méthodes dessus (si ces objets implémentent le modèle jetable, ils pourraient le lancer ObjectDisposedException
dans ce cas).
Si vous avez une collection autre que a List<>
, la suppression des éléments morts de cette collection peut toujours impliquer la création d'une liste morte (car la suppression pendant l'itération peut ne pas être possible). À mon avis, il est plus agréable, au niveau de la conception, de créer la liste morte juste avant qu'elle ne soit utilisée, en parcourant la collection à la recherche de IsDead
drapeaux, plutôt qu'en essayant de maintenir la liste lorsque des objets sont tués.
Une fois que vous avez terminé avec une liste morte, vous devez la Clear()
conserver, puis la conserver pour la réutiliser plus tard.