2013-04-27 38 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