当移除对象时,for循环过早结束

Mic*_*ard 0 c# for-loop list

嗨我有一个for循环问题.

看起来像这样

for (int i = 0; i < ObjectManager.Instance.Objects.Count; i++)
{
   if (ObjectManager.Instance.Objects[i] is Asteroid)
   {
      ObjectManager.Instance.Objects.Remove(ObjectManager.Instance.Objects[i]);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是当我移除对象时,计数会变短,这会导致循环过早结束.有没有办法在没有一堆额外循环的情况下做到这一点.

Dmi*_*nko 8

你为什么不向后循环?

// Just change the order from Count - 1 down to 0 
for (int i = ObjectManager.Instance.Objects.Count - 1; i >= 0; --i)
{
   if (ObjectManager.Instance.Objects[i] is Asteroid)
   {
      ObjectManager.Instance.Objects.Remove(ObjectManager.Instance.Objects[i]);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你必须循环前进(例如,如果实例应该按创建顺序删除它们,因为它们彼此依赖),你可以用这种方式修改for循环:

for (int i = 0; i < ObjectManager.Instance.Objects.Count;)  // <- No increment here
  if (ObjectManager.Instance.Objects[i] is Asteroid)
    ObjectManager.Instance.Objects.Remove(ObjectManager.Instance.Objects[i]);
  else 
    i += 1; // <- Increment should be here!
Run Code Online (Sandbox Code Playgroud)

另一种可能性是Linq:

ObjectManager.Instance.Objects.RemoveAll(item => item is Asteroid);
Run Code Online (Sandbox Code Playgroud)