Прежде всего: терминология. Если вы скажете «список мусора», люди подумают, что вы говорите о сборщике мусора. Давайте назовем это «мертвым списком».
Как вы, вероятно, обнаружили, отсюда и ваш вопрос: вы не можете удалять элементы из коллекции, пока выполняете ее. Если ваша коллекция - List<>то самый простой способ удалить элементы из нее:
for(int i = list.Count-1; i >= 0; --i)
{
if(list[i].IsDead)
list.RemoveAt(i);
}
Обратите внимание, что вы повторяете в обратном направлении . Вы можете удалять элементы во время итерации вперед, но это сложнее и требует goto. Вы не можете сделать это с foreach.
Вы можете сделать удаление отдельно от цикла обновления. Или вы можете объединить его в свой цикл обновления. Всегда делайте RemoveAtв конце цикла - после этой точки в цикле,list[i] нельзя считать действительным (оно снова становится действительным на следующей итерации).
Также обратите внимание, что каждый объект имеет свой собственный IsDeadфлаг (если вы используете шаблон удаления, вы можете сделать его IsDisposed) - вам вообще не нужно поддерживать «мертвый список».
Использование флага для каждого элемента предпочтительнее для производительности, так как вам не нужно искать в списке, чтобы выполнить удаление. И это также предпочтительно для дизайна - это означает, что каждый объект может легко проверить, мертв ли он, - так что вы случайно не вызываете какие-либо методы для него (если эти объекты реализуют одноразовый шаблон, они могут бросить ObjectDisposedExceptionв этом случае).
Если у вас есть коллекция, отличная от a List<>, то удаление мертвых элементов из этой коллекции может по-прежнему включать создание мертвого списка (поскольку удаление во время итерации может быть невозможным). На мой взгляд, лучше создавать дизайн мертвого списка непосредственно перед его использованием, перебирая коллекцию в поисках IsDeadфлагов, вместо того, чтобы пытаться поддерживать список при уничтожении объектов.
Как только вы закончили с мертвым списком, вы должны Clear()это сделать, а затем сохранить его для повторного использования позже.