【问题标题】:Looping and changing a list - remove doesn't always work循环和更改列表 - 删除并不总是有效
【发布时间】:2013-04-27 11:33:44
【问题描述】:

我正在尝试循环 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 phone 平台..

【问题讨论】:

  • rowspondRanks是什么类型?也许您打算改用RemoveAt
  • 正如@ChrisSinclair 所说。 RemoveAt 删除一个位置。删除查找对象
  • 除了其他答案,值得注意的是,您的循环只会执行 39 次...您需要将其更改为 for (int i = 0; i &lt;= 39; i++) 或更首选的方式 for (int i = 0; i &lt; 40; i++) ...甚至可能将硬值 40 提取到一个名为迭代的变量中?
  • 列表是整数。此外,在我修复此错误后,for 循环将发生变化。我希望从列表中删除该行、位置成员。感谢您的所有帮助!
  • 我真的不得不使用 RemoveAt .. 不知道为什么我花了这么多时间才意识到!非常感谢!!

标签: c# list for-loop windows-phone-7.1


【解决方案1】:

我很确定您应该使用List.RemoveAt 而不是List.RemoveRemoveAt 将删除指定索引处的项目,而Remove 将查找您传入的 that 对象,如果它在列表中,则将其从列表中删除。但我很确定,看看你的代码,locationrank 代表 index,而不是对象本身。

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 有足够的元素 (39)(或将 i &lt; 39 更改为最大长度的上限)

【讨论】:

  • 另外值得注意的是,他的循环最多会执行 39 次。最好的办法是使用 var iterations = Math.Min(MaxIterations, Math.Min(rows.Count, pondRanks.Count)); 之类的东西来捕获迭代
  • 是的,这就是我上次编辑的意思,只是没有你说得那么好。 :)
  • 即使他不考虑列表/集合计数,当他想要 40 次时,他的循环执行了 39 次。他应该至少将 39 更改为 40。
  • @m-y 啊,好接。我对这个事实完全目瞪口呆
  • 我希望删除实际的成员,对不起,名称具有误导性.. 列表中有 39 个元素
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多