我正在制作一个小型纸牌游戏,而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);
}
}
答案 0 :(得分:2)
您对handTemp
变量的想法是正确的,但您的实施中存在错误:
List<Card> handTemp = new List<Card>();
handTemp = players[0].hand;
这个基本说是“创建一个新变量handTemp
,为其分配一个新列表,然后完全丢弃该列表,而是将handTemp
指向players[0].hand
&#39; 。你可能想做的是:
List<Card> handTemp = new List<Card>(players[0].hand);
或者,正如Henk在下面评论的那样,如果您处于.NET 3.5+的精彩世界中,您可以使用LINQ方法:
var handTemp = players[0].hand.ToList();
答案 1 :(得分:0)
如果我清楚地了解您的问题,players[0].hand
和handTemp
是参考类型。
所以,当您从foreach
中删除项目时players[0].hand
,这意味着您还要从handTemp
中移除项目。
注意:无法在迭代集合的同时修改集合。
解决这个问题你可以替换,
handTemp = players[0].hand;
与handTemp = players[0].hand.ToList();
.ToList()
将创建新的List()
,不会影响handTemp
进行修改。
希望这有帮助。如果我错了,请纠正我。