2013-04-27 46 views
2

我試圖通過循環40次並更改過程中的列表。循環和更改列表 - 刪除並不總是工作

這是代碼:

for (int i = 0; i < 40; i++) 
{ 
    location = rand.Next(rows.Count); 
    rank = rand2.Next(pondRanks.Count); 
    ComputerPonds[rows[location]].Rank = (PondRank)pondRanks[rank]; 
    rows.Remove(location); 
    pondRanks.Remove(rank); 
} 

出於某種原因,刪除不會發生所有的時間,只有有時。任何人都有一個建議? 這兩個列表都是List,它們有40個元素,我想刪除元素本身。 即使在調試時我可以看到列表計數不相同(它們都有相同的初始數字,並且它們都需要在此循環中刪除)。如果有關係,我正在開發windows手機平臺。

+4

'rows'和'pondRanks'是什麼類型?也許你打算使用'RemoveAt'來代替。 – 2013-04-27 11:36:50

+0

正如@ChrisSinclair所說。 RemoveAt在某個位置移除。刪除尋找對象 – Rob 2013-04-27 11:39:25

+1

除了其他答案,值得注意的是,你的循環將只執行39次...你需要將它改爲'for(int i = 0; i <= 39; i ++)'或者更喜歡的方式'for(int i = 0; i <40; i ++)'...甚至可以將40的硬值提取到名爲迭代的變量中? – 2013-04-27 11:45:14

回答

6

我很確定你應該使用List.RemoveAt而不是List.RemoveRemoveAt將刪除指定索引處的項目,而Remove將查找您傳入的對象,並將其從列表中移除,如果它在其中。但我敢肯定,看看您的代碼locationrank代表索引,而不是對象本身。

for (int i = 0; i < 39; i++) 
{ 
    location = rand.Next(rows.Count); 
    rank = rand2.Next(pondRanks.Count); 
    ComputerPonds[location].Rank = (PondRank)pondRanks[rank]; 
    rows.RemoveAt(location); 
    pondRanks.RemoveAt(rank); 
} 

編輯:您也可能要考慮確保您rowspondRanks有開始循環(或改變i < 39以最大程度的發揮,在它們的長度上限)

之前足夠的元素(39)
+0

也值得注意的是他的循環最多可以執行39次。最好的辦法是使用'var iterations = Math.Min(MaxIterations,Math.Min(rows.Count,pondRanks.Count))'來捕獲迭代;' – 2013-04-27 11:47:44

+0

是的,這就是我的最後一次編輯,只是沒有把它和你一樣好。 :) – 2013-04-27 11:49:20

+1

即使他沒有考慮清單/收藏數量,當他想要40時,他的循環會執行39次。他應該至少將39更改爲40。 – 2013-04-27 11:50:58