在foreach循环中修改集合时抛出的错误

时间:2014-04-02 10:56:27

标签: 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)
   {
       players[0].hand.Remove(c);
       pile.Add(c);
   }
}

2 个答案:

答案 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].handhandTemp是参考类型。

所以,当您从foreach中删除项目时players[0].hand,这意味着您还要从handTemp中移除项目。

注意:无法在迭代集合的同时修改集合。

解决这个问题你可以替换, handTemp = players[0].hand;handTemp = players[0].hand.ToList();

。{

.ToList()将创建新的List(),不会影响handTemp进行修改。

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