C# 在foreach循环中修改集合时引发错误
我正在做一个小纸牌游戏,foreach循环在集合的最后一次迭代中抛出一个错误。我认为这与内存寻址有关,因此添加了handTemp列表以进行迭代。但是仍然抛出同样的错误,有人能帮忙吗?谢谢C# 在foreach循环中修改集合时引发错误,c#,loops,foreach,C#,Loops,Foreach,我正在做一个小纸牌游戏,foreach循环在集合的最后一次迭代中抛出一个错误。我认为这与内存寻址有关,因此添加了handTemp列表以进行迭代。但是仍然抛出同样的错误,有人能帮忙吗?谢谢 List<Card> handTemp = new List<Card>(); handTemp = players[0].hand; foreach (Card c in handTemp) { if (c.strName == crd.strName) {
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);
}
}
List handTemp=new List();
handTemp=玩家[0]。手;
foreach(handTemp中的卡c)
{
if(c.strName==crd.strName)
{
玩家[0]。手。移除(c);
添加(c);
}
}
您使用handTemp
变量的想法是正确的,但您的实现中有一个错误:
List<Card> handTemp = new List<Card>();
handTemp = players[0].hand;
或者,正如Henk在下面评论的那样,如果您身处.NET 3.5+的奇妙世界,您可以使用LINQ方法:
var handTemp = players[0].hand.ToList();
如果我在这里清楚地理解了您的问题,那么玩家[0]。hand和
handTemp
是参考类型
因此,在foreach
中,当您从players[0]中删除项目时,hand
表示您也从handTemp
中删除项目
注意:不能在遍历集合的同时对其进行修改。
要解决此问题,您可以替换,
handTemp=players[0]。手代码>与handTemp=players[0]。hand.ToList()代码>
.ToList()
将创建一个新的列表()
,并且不会影响要修改的handTemp
希望这有帮助。如果我错了,请纠正我。这不是一个错误,也不是问题的答案。@Maarten不确定我是否遵循:此修复程序将使呈现的代码正常工作。有人可以评论性能与for
循环的对比,但这种评论很难在真空中做出(考虑到这些对象代表玩家在小型纸牌游戏中的手,我不认为收集的数量会很大)。@decPl我误解了你回答中的一点,我道歉。你说得对,马尔顿,谢谢你的意见。我想我现在拿到了。:)是的。代码来自页面上的一个建议答案,但它仍然抛出错误。
var handTemp = players[0].hand.ToList();