Прежде всего: терминология. Если вы скажете «список мусора», люди подумают, что вы говорите о сборщике мусора. Давайте назовем это «мертвым списком».
Как вы, вероятно, обнаружили, отсюда и ваш вопрос: вы не можете удалять элементы из коллекции, пока выполняете ее. Если ваша коллекция - 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()
это сделать, а затем сохранить его для повторного использования позже.