Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在foreach循环中修改集合时引发错误_C#_Loops_Foreach - Fatal编程技术网

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

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) {

我正在做一个小纸牌游戏,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);
   }
}
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();