Primeiro de tudo: terminologia. Se você diz "lista de lixo", as pessoas pensam que você está falando sobre o coletor de lixo. Vamos chamá-lo de "lista morta".
Como você provavelmente descobriu, daí a sua pergunta, você não pode remover itens de uma coleção enquanto estiver iterando por ela. Se sua coleção é uma List<>
maneira mais simples de remover itens, é:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Observe que você itera para trás . Você pode remover itens enquanto faz a iteração para a frente, mas é mais confuso e requer um goto
. Você não pode fazer isso com foreach
.
Você pode fazer a remoção separadamente do seu loop de atualização. Ou você pode mesclá-lo ao seu loop de atualização. Sempre faça o RemoveAt
final do loop - depois desse ponto no loop, list[i]
não poderá ser considerado válido (ele se tornará válido novamente na próxima iteração).
Observe também que cada objeto tem seu próprio IsDead
sinalizador (se você estiver usando o padrão de descarte, poderá fazê-lo IsDisposed
) - você realmente não precisa manter uma "lista de mortos".
É preferível o desempenho de um sinalizador em cada item, pois você evita procurar na lista para fazer a remoção. E também é preferível para o design - significa que cada objeto pode verificar facilmente se está morto - para que você não invoque acidentalmente nenhum método (se esses objetos estiverem implementando o padrão descartável, eles podem ser lançados ObjectDisposedException
nesse caso).
Se você tiver uma coleção diferente de uma List<>
, a remoção de itens inativos dessa coleção ainda poderá envolver a criação de uma lista inoperante (pois a remoção durante a iteração pode não ser possível). Na minha opinião, é melhor, em termos de design, criar a lista de mortos imediatamente antes de ser usada, percorrendo a coleção procurando IsDead
sinalizadores, em vez de tentar manter a lista à medida que os objetos são mortos.
Depois de terminar com uma lista de mortos, você deve Clear()
fazê - lo e mantê-lo por perto para reutilizá-lo mais tarde.