1 - при использовании
foreach
ни сама коллекция (лист, массив, перечисление, не важно) ни ее элементы, не подлежат изменению. только чтение. это правило языка C# (но за Mono не отвечаю)
2 - про использовании
for
обходите коллекцию с конца, а не сначала, таким образом не будет проблем с индексами (хотя можно и
while
использовать для обхода с головы, но на
for
думаю быстрее поймете суть). пример
for(int i = Group.Count - 1; i >= 0; i--)
{
Destroy(list[i]);
list.RemoveAt(i); // о размере списка не заморачиваемся вообще
}
3 - Unity поддерживает LINQ? там можно было бы еще элегантнее. но LINQ всегда проигрывает по производительности, которая в играх обычно важна. тем не менее
Group.RemoveAll(tmp => tmp is MissingReferenceException);
// хотя надо проверить совместимость
upd вообще то выходит Destroy не делаем. тогда теряется вся элегантность.. ну или надо подольше подумать ))
ps ну тогда уж и
while
это примерно так
var i = 0;
while (i < Group.Count)
if (Group[i] is MissingReferenceException)
{
Destroy(Group[i]);
Group.RemoveAt(i);
}
else
i++;
ну и хардкорное применение
for
приктически так же выглядит
for (var i = 0; i < Group.Count;) // да да, инкримент просто не пишем и получается аналог while
if (Group[i] is MissingReferenceException)
{
Destroy(Group[i]);
Group.RemoveAt(i);
}
else
i++;