2013-11-24 51 views
0

我有以下的集合,其中我進入使用方法的一些值:刪除從System.Collections.ObjectModel.Collection在C#中的所有項目

Collection<double> temp = new Collection<double>(); 

我想在刪除集合中的所有項目某些時候,所以我可以能夠從頭開始重新填充它,因爲我做了我第一次初始化程序。 我想這樣的,但它不工作。

for (int i = 0; i < temp.Count; i++) 
     { 
      temp.RemoveAt(i); 
     } 

出了什麼問題?

感謝您的幫助!

回答

5

使用Clear方法:

temp.Clear(); 

之所以你的循環不起作用,因爲當你做一個RemoveAt,所有項目的指標轉移。所以,說你開始使用此:

6,2,8,5,3

在第一次迭代,i0,並且第一個項目將被刪除:

2,8,5,3

對於第二迭代,i1,但是這NO-再下一個要刪除的項目,所以你得到這樣的:

2,5,3

然後,i2,你會得到這樣的:

2,5

現在i> temp.Count。看看如何留下剩餘的物品?

+0

'+ 1'爲解釋爲什麼'RemoveAt'在他的情況下不起作用.. –

+0

謝謝!我現在知道了...!非常感謝您的解釋。 – betelgeuse

2

您可以使用Clear()方法 -

temp.Clear(); 
1

通過調用RemoveAt,我們假定你是有沒有給定索引處存在一個項目。然而,刪除它,收集少了一個項目,因此您for循環就沒有意義了。它不會丟的,只是因爲temp.Count異常每次迭代過程中被評估。實際上,它會從集合中刪除僅隔項目。

相反,使用Clear方法。

1

您不能使用索引刪除,只要您刪除第一個項目,集合被重新編制索引,第二個元素變成第一個,第三個變成第二個等等。您將刪除每個奇怪的元素,出去後得到和異常的收藏大小。在。你可能會得到一個異常加速器,只要你刪除第一個項目,枚舉器就會抱怨你不能修改你正在枚舉的集合。

有幾種方法可以解決這個問題,最簡單的方法是使用專用方法清除集合(清除)。在收集引用的情況下,您也可以創建一個來自原始集合的引用副本的集合,並遍歷克隆的集合,但從原始集合中刪除。

0

如果你真的需要一次刪除一個元素(而不是調用Clear()來將它們全部刪除一氣呵成),那麼你需要以相反的順序進行迭代:

int count = temp.Count; 
for (int i = count-1; i >= 0; i--) 
{ 
    temp.RemoveAt(i); 
} 

這將刪除來自列表末尾的元素,以便您的索引始終在剩餘列表的範圍內,並從列表中刪除所有項目。

或者只使用尺寸爲計數器:

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

這可不是用在所有集合迭代器和你得到的計數開始刪除元素它不應該失敗之前。

像這樣的東西只會在需要對每個元素進行一些處理時才需要,然後再從列表中刪除。

+0

或者只是在索引0處刪除。但清除方法是最好的方法。 – Wjdavis5

+0

@ Wjdavis5 - 好點。我已經把它作爲一個替代方案。 – ChrisF

相關問題