我正在做一个小纸牌游戏,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);
   }
}发布于 2014-04-02 19:03:57
您使用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);或者,正如亨克下面评论的那样,如果你在奇妙的.NET 3.5+世界中,你可以使用LINQ方法:
var handTemp = players[0].hand.ToList();发布于 2014-04-02 19:23:14
如果我在这里清楚地理解了你的问题,players[0].hand和handTemp是引用类型。
因此,在foreach中,当您从players[0].hand中删除项目时,这意味着您也在从handTemp中删除项目。
注意:不能在迭代集合的同时对其进行修改。
要解决此问题,可以将handTemp = players[0].hand;替换为handTemp = players[0].hand.ToList();
.ToList()将创建一个新的List(),不会影响要修改的handTemp。
希望这能有所帮助。如果我错了,请纠正我。
https://stackoverflow.com/questions/22809260
复制相似问题