收集被修改;枚举操作可能无法执行

时间:2012-03-15 19:09:53

标签: c#

我有这个代码,如果玩家不活着就会移除玩家,但我认为问题与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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:3)

查询要删除的玩家的集合:

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

然后删除玩家:

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

答案 2 :(得分:0)

您应该使用反向删除集合的元素:

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