【问题标题】:Error thrown when collection is modified within foreach loop [duplicate]在 foreach 循环中修改集合时引发错误 [重复]
【发布时间】:2014-04-02 10:56:26
【问题描述】:

我正在制作一个小型纸牌游戏,foreach 循环在集合的最后一次迭代中抛出错误。我认为这与内存寻址有关,因此添加了要迭代的 handTemp 列表。但是仍然抛出相同的错误,有人可以帮忙吗?谢谢。

List<Card> handTemp = new List<Card>();
handTemp = players[0].hand;

foreach (Card c in handTemp)
{
   if (c.strName == crd.strName)
   {
       players[0].hand.Remove(c);
       pile.Add(c);
   }
}

【问题讨论】:

  • 确实如此。该代码来自页面上的建议答案之一,但仍会引发错误。

标签: c# loops foreach


【解决方案1】:

您对handTemp 变量的想法是正确的,但您的实现中有错误:

List<Card> handTemp = new List<Card>();
handTemp = players[0].hand;

这基本上是说'创建一个新变量handTemp,为其分配一个新列表,然后完全丢弃该列表,而不是将handTemp指向players[0].hand'。您可能想要做的是:

List<Card> handTemp = new List<Card>(players[0].hand);

或者,正如 Henk 在下面评论的那样,如果您身处 .NET 3.5+ 的美妙世界,您可能会使用 LINQ 方法:

var handTemp = players[0].hand.ToList();

【讨论】:

  • 这不是错误,也不是问题的答案。
  • @Maarten 不确定我是否遵循:此修复程序将使呈现的代码正常工作。有人可以评论一下性能与for 循环,但这样的 cmets 很难在真空中制作(鉴于这些对象代表玩家在小型纸牌游戏中的手,我不认为集合会很大)。跨度>
  • @decPl 我误读了你的回答,我很抱歉。你是对的。
  • Maarten,decPL 感谢您的意见。我想我现在明白了。 :)
【解决方案2】:

如果我在这里清楚地理解了您的问题,players[0].handhandTemp 是参考类型。

所以在foreach 中,当您从players[0].hand 中删除项目时,它指的是您也在从handTemp 中删除项目。

注意:不能在迭代的同时修改集合。

要解决此问题,您可以替换, handTemp = players[0].hand;handTemp = players[0].hand.ToList();

.ToList() 会创建一个新的List(),不会影响handTemp 的修改。

希望对您有所帮助。如果我错了,请纠正我。

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 2015-03-03
    • 2013-10-09
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多