Innanzitutto: terminologia. Se dici "lista dei rifiuti", la gente penserà che stai parlando del Garbage Collector. Chiamiamolo la "lista morta".
Come probabilmente hai scoperto, quindi la tua domanda, non puoi rimuovere elementi da una raccolta mentre stai iterando attraverso di essa. Se la tua raccolta è un modo List<>
allora il modo più semplice per rimuovere elementi da essa è:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Si noti che si esegue l'iterazione all'indietro . È possibile rimuovere gli elementi mentre si procede in avanti, ma è più caotico e richiede a goto
. Non puoi farlo con foreach
.
Puoi effettuare la rimozione separatamente dal tuo ciclo di aggiornamento. Oppure puoi unirlo nel tuo ciclo di aggiornamento. Fai sempre ilRemoveAt
la fine del loop: dopo quel punto nel loop,list[i]
non può essere considerato valido (diventa nuovamente valido alla successiva iterazione).
Si noti inoltre che ogni oggetto ha il suo IsDead
flag (se si utilizza il modello di eliminazione, è possibile crearlo IsDisposed
) - in realtà non è necessario mantenere un "elenco morto".
L'uso di un flag su ciascun elemento è preferibile per le prestazioni, poiché si evita di dover cercare nell'elenco per eseguire la rimozione. Ed è anche preferibile per la progettazione - significa che ogni oggetto può facilmente verificare se è morto - quindi non chiamare accidentalmente alcun metodo su di esso (se questi oggetti implementano il modello usa e getta, potrebbero lanciareObjectDisposedException
in questo caso ).
Se si dispone di una raccolta diversa da a List<>
, la rimozione di elementi morti da quella raccolta può comunque comportare la creazione di un elenco morto (poiché la rimozione durante l'iterazione potrebbe non essere possibile). A mio avviso, è più bello, dal punto di vista del design, creare la lista morta proprio prima che venga utilizzata, ripetendo la raccolta alla ricerca di IsDead
bandiere, piuttosto che cercare di mantenere la lista mentre gli oggetti vengono uccisi.
Una volta che hai finito con un elenco morto, dovresti Clear()
farlo e poi tenerlo in giro per riutilizzarlo in seguito.