2014-02-27 68 views
0

嗨我有一個for循環的問題。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]); 
    } 
} 

但數越短,而我刪除的對象,這將導致循環提前結束。有沒有辦法做到這一點,沒有一堆額外的循環。

+3

如何以相反的順序進行計數。 –

+2

ObjectManager.Instance.Objects的類型是什麼? –

+1

你可以向後循環 –

回答

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]); 
    } 
} 

如果你必須循環向前(例如,如果實例應該在創建它們,因爲它們是互相依賴的順序被刪除),你可以以這種方式循環修改:

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! 

另一種可能性是的LINQ

ObjectManager.Instance.Objects.RemoveAll(item => item is Asteroid); 
4

三個選項:

  • 如果ObjectManager.Instance.ObjectsList<T>,使用List<T>.RemoveAll有一個謂語,使你的代碼簡單:從收集的年底

    // This replaces your whole loop... 
    ObjectManager.Instance.Objects.RemoveAll(x => x is Asteroid); 
    
  • 計數比從一開始,以便您不需要以後調整索引:

    for (int i = ObjectManager.Instance.Objects.Count - 1; i >= 0; i--) 
    
  • 只需在調用Remove後遞減i,以便在下一次迭代中查看正確的索引。

注意的是,在第二和第三個選項的代碼將是簡單了很多,如果你提取表達ObjectManager.Instance.Objects到一個局部變量您使用它4次前仔細閱讀。也考慮使用RemoveAt(i)而不是Remove(instances[i]),假設RemoveAt可用於您正在使用的類型。