Zuallererst: Terminologie. Wenn Sie "Müllliste" sagen, denken die Leute, Sie sprechen über den Müllsammler. Nennen wir es die "tote Liste".
Wie Sie wahrscheinlich festgestellt haben, können Sie daher bei Ihrer Frage keine Elemente aus einer Sammlung entfernen, während Sie diese durchlaufen. Wenn es sich bei Ihrer Sammlung um eine handelt List<>
, können Sie Elemente am einfachsten entfernen:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Beachten Sie, dass Sie rückwärts iterieren . Sie können Elemente entfernen, während Sie vorwärts iterieren, aber es ist unordentlicher und erfordert a goto
. Sie können es nicht mit tun foreach
.
Sie können das Entfernen entweder separat von Ihrer Aktualisierungsschleife durchführen. Oder Sie können es in Ihre Update-Schleife einfügen. Führen Sie dies immer RemoveAt
am Ende der Schleife durch - nach diesem Punkt in der Schleife list[i]
kann dies nicht als gültig angesehen werden (es wird bei der nächsten Iteration wieder gültig).
Beachten Sie auch, dass jedes Objekt ein eigenes IsDead
Flag hat (wenn Sie das Entsorgungsmuster verwenden, können Sie es erstellen IsDisposed
) - Sie müssen überhaupt keine "tote Liste" führen.
Die Verwendung eines Flags für jedes Element ist für die Leistung vorzuziehen, da Sie nicht die Liste durchsuchen müssen, um das Entfernen durchzuführen. Und es ist auch für das Design vorzuziehen - es bedeutet, dass jedes Objekt leicht überprüfen kann, ob es tot ist - damit Sie nicht versehentlich Methoden darauf aufrufen (wenn diese Objekte das Einwegmuster implementieren, können sie ObjectDisposedException
in diesem Fall werfen ).
Wenn Sie eine andere Sammlung als a haben List<>
, muss beim Entfernen toter Elemente aus dieser Sammlung möglicherweise noch eine tote Liste erstellt werden (da das Entfernen während der Iteration möglicherweise nicht möglich ist). Meiner Meinung nach ist es in Bezug auf das Design IsDead
besser , die Dead List direkt vor ihrer Verwendung zu erstellen, indem Sie die Sammlung nach Flags durchsuchen, anstatt zu versuchen, die Liste beizubehalten, wenn Objekte getötet werden.
Sobald Sie mit einer toten Liste fertig sind, sollten Sie Clear()
sie aufbewahren und dann aufbewahren, um sie später wiederzuverwenden.