2012-10-02 70 views
-2

我在VB.Net中使用了一個ArrayList,它正在填充300多條記錄。當我處理它們時,我刪除了指定索引處的記錄,因爲它們沒有按順序存儲。我的問題是,當我第一次看Arraylist的計數我使用之前RemoveAt()伯爵說373,但使用RemoveAt()一對夫婦的時間後,我發現了數去周圍425使用.NET ArrayList .RemoveAt()不重新計算正確的計數

從我在MSDN的理解參考頁面ArrayList.RemoveAt(),該方法應刪除指定索引處的元素,並將計數減1。

如果有人遇到這個問題或有任何線索,爲什麼它這樣做,請讓我知道。

更新 arraylist中的每個元素都是對象的一個​​實例。

更新這是找到arraylist中的一個元素來提取並刪除它的代碼。

While (SimsRun.Count > 0) 

     counter = 0 

     'Get a new record 
     While (counter < SimsRun.Count) 

      tempSim = SimsRun(counter) 

      If tempSim.BatchIndex = (simToFind - 1) Then 

       SimsRun.RemoveAt(counter) 

       Exit While 

      End If 

      counter = counter + 1 

     End While 

     Process Record 
     . 
     . 
     . 
     . 

    End While 

外循環,這是在將運行,而SimsRun.Count()> 0

+5

這不應該發生(除非別的東西在添加元素)。你能顯示重現行爲的代碼嗎? –

+1

需要一個SSCCE(http://SSCCE.org) –

+0

那麼該計劃是如此複雜,我不能發送只顯示它的地方。但是我可以包含刪除指定位置元素的代碼部分。再有問題讓我知道。 – Jared

回答

1

我不知道這是否與你的問題,但你是從零計數和移除物體,然後遞增你的計數器。通過這樣做,您實際上正在跳過列表中的其他所有項目。如果您有4個元素,並且您刪除了項目0,並且計數器= 0,那麼您要檢查的下一個項目是項目0,而不是項目1,因爲您刪除了項目0,而項目1現在是項目0。感?您可能需要更改處理計數器變量的方式,或者從數組末尾開始倒計時。至於最後有太多的項目,只要在移動時輸入一個Debug.WriteLine打印出您的數組數量,您應該看到數量減少,而不是增加。如果數組正在增長,那麼你有沒有發佈的代碼會導致這種情況。

+0

當我想要在批處理文件中查找特定記錄時,此循環會關閉。一旦發現它被處理,然後它返回到這個循環,計數器被初始化爲零,然後再次開始搜索。對不起,我忘了在循環之前加入反循環器。 – Jared