首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在foreach循环中修改集合时引发错误

在foreach循环中修改集合时引发错误
EN

Stack Overflow用户
提问于 2014-04-02 18:56:27
回答 2查看 76关注 0票数 1

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

代码语言:javascript
运行
复制
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);
   }
}
EN

回答 2

Stack Overflow用户

发布于 2014-04-02 19:03:57

您使用handTemp变量的想法是正确的,但在您的实现中有一个错误:

代码语言:javascript
运行
复制
List<Card> handTemp = new List<Card>();
handTemp = players[0].hand;

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

代码语言:javascript
运行
复制
List<Card> handTemp = new List<Card>(players[0].hand);

或者,正如亨克下面评论的那样,如果你在奇妙的.NET 3.5+世界中,你可以使用LINQ方法:

代码语言:javascript
运行
复制
var handTemp = players[0].hand.ToList();
票数 2
EN

Stack Overflow用户

发布于 2014-04-02 19:23:14

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

因此,在foreach中,当您从players[0].hand中删除项目时,这意味着您也在从handTemp中删除项目。

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22809260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档