2010-05-19 86 views
8

爲什麼下面的代碼不能清除所有數組列表數據?清除所有數組列表數據

 Console.WriteLine("Before cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 20 
     for (int i = 0; i < ID.Count; i++) 
     { 
      ID.RemoveAt(i); 
     } 
     Console.WriteLine("After cleaning:" + Convert.ToString(ID.Count)); 
     //ID.Count = 10 

爲什麼10打印到屏幕上?

也許還有另一個特殊的功能,刪除所有東西?

+0

第一次通過循環移除位置0處的項目。現在列表中有19個項目,位置1上的項目現在移動到位置0,2 - > 1,3-> 2等。通過循環第二次移除位置1上的項目(這曾經是項目2)。您已經跳過位置0處的物品(曾經是物品1)。通過這種方式,您將從列表中刪除每個第二項。 – 2010-05-19 07:07:57

回答

6
`Array.Clear()` 

刪除數組中的所有項目。

`Array.RemoveAt(i)` 

刪除數組中的第i個索引的元素。

2

使用clear()方法

變化ID.RemoveAt(i);ID.RemoveAt(0);

每當一個元件被從集合中刪除,其索引也在變化。因此,當您說ID.RemoveAt(0);時,索引1處的元素現在將被移至索引0.因此,再次刪除相同的元素(如出列)。直到你到達最後一個元素。但是,如果您想一次刪除所有元素,則可以更好地使用Clear()方法。

2

刪除10個項目後,ID.Count() == 10i == 10因此循環停止。使用ID.Clear()刪除數組列表中的所有項目。

11

您實際上只調用RemoveAt 10次。當i達到10時,ID.Count也將是10。您可以通過這樣做解決這個問題:

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(0); 
} 

,這是O(N )操作不過,因爲涉及複製一切從列表中刪除的啓動項。

更有效(爲O(n)):

int count = ID.Count; 
for (int i = 0; i < originalCount; i++) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

或等價的,但簡單:

while (ID.Count > 0) 
{ 
    ID.RemoveAt(ID.Count - 1); 
} 

但使用ID.Clear()可能比所有這些更高效的,儘管它也Ø (N)。

1

您的代碼不會:

ID.RemoveAt(0); 
... 
ID.RemoveAt(9); 
ID.RemoveAt(10); \\ at this point you have already removed 10 
       \\ items so there is nothing left on 10- 19, but you are left with 
       \\ the 'first' 10 elements 
... 
ID.RemoveAt(19); 

一般來說你的方法從列表中移除所有的第二個元素..

使用ArrayList.Clear,而不是其他已經提到。