集合已被修改;枚举操作可能无法执行。

3

我有这段代码,如果玩家没有生存,则删除该玩家,但我发现问题与foreach循环有关。我看到了一些涉及创建新列表的解决方案,但我不知道如何将其应用到我的代码中。请问有谁能够给予一些指导吗?

private Dictionary<int, Player> numPlayers = new Dictionary<int, Player>();

private void CheckPlayers()
{
    foreach (Player player in numPlayers.Values)
    {
        if (!player.isAlive)
        {
            canvas.Children.Remove(player.hand);
            numPlayers.Remove(player.id); // breaks here
        }
    }
}

3个回答

3

使用 foreach 迭代的集合是无法进行修改的。你需要做的是将你想要删除的元素添加到一个新的列表中,然后在构建完该列表后再进行删除。

var dead = numPlayers.Values
    .Where(p => !p.isAlive)
    .ToList();

foreach(var player in dead)
{
    canvas.Children.Remove(player.hand);
    numPlayer.Remove(player.id);
}

我似乎无法解决 Where - 我不确定我缺失了哪个引用? - Michael
1
你需要使用 using System.Linq; - James Michael Hare

3

查询要删除的球员集合:

var playersToDelete = numPlayers.Values.Where(p => !p.isAlive).ToList();

然后删除玩家:

foreach(var player in playersToDelete) {
    canvas.Children.Remove(player.hand);
    numPlayers.Remove(player.id);
}

我似乎无法解决 Where - 我不确定我可能缺少哪个引用? - Michael
1
你需要使用 System.Linq。我想你已经引用了 System.Core - jason

0

你应该使用反向循环来删除集合中的元素:

for(int i = numPlayers.Values.Count - 1; i <= 0; i--)
{
//Remove it.
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接