En primer lugar: terminología. Si dices "lista de basura", la gente pensará que estás hablando del recolector de basura. Llamémosle la "lista muerta".
Como probablemente haya descubierto, de ahí su pregunta, no puede eliminar elementos de una colección mientras está iterando a través de ella. Si su colección es una, List<>
entonces la forma más sencilla de eliminar elementos es:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Tenga en cuenta que itera hacia atrás . Puede eliminar elementos mientras itera hacia adelante, pero es más complicado y requiere a goto
. No puedes hacerlo con foreach
.
Puede realizar la eliminación por separado de su ciclo de actualización. O puede fusionarlo en su ciclo de actualización. Siempre haga lo siguiente RemoveAt
al final del ciclo; después de ese punto en el ciclo, list[i]
no puede considerarse válido (vuelve a ser válido en la próxima iteración).
Tenga en cuenta, además, que cada objeto tiene su propia IsDead
bandera (si está utilizando el patrón de eliminación, podría hacerlo IsDisposed
): en realidad no necesita mantener una "lista muerta".
Es preferible usar una bandera en cada elemento para el rendimiento, ya que evita tener que buscar en la lista para realizar la eliminación. Y también es preferible para el diseño, significa que cada objeto puede verificar fácilmente si está muerto, por lo que no llama accidentalmente a ningún método (si estos objetos están implementando el patrón desechable, podrían arrojarse ObjectDisposedException
en este caso).
Si tiene una colección distinta de a List<>
, entonces eliminar elementos muertos de esa colección aún puede implicar la creación de una lista muerta (ya que la eliminación durante la iteración puede no ser posible). En mi opinión, es mejor, en cuanto al diseño, crear la lista muerta justo antes de que se use, iterando sobre la colección buscando IsDead
banderas, en lugar de tratar de mantener la lista a medida que se eliminan los objetos.
Una vez que haya terminado con una lista muerta, debe Clear()
hacerlo, y luego guardarla para reutilizarla más adelante.