【问题标题】:Collection was modified; enumeration operation may not execute收藏已修改;枚举操作可能无法执行
【发布时间】:2012-04-01 08:37:56
【问题描述】:

如果玩家不活着,我有这段代码会删除玩家,但我认为问题与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
        }
    }
}

【问题讨论】:

标签: c#


【解决方案1】:

查询玩家要删除的收藏:

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

然后删除播放器:

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

【讨论】:

  • 我似乎无法解决 Where - 我不确定我可能缺少哪个参考资料?
  • 您需要使用System.Linq。我想你已经参考了System.Core
【解决方案2】:

您无法使用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 - 我不确定我可能缺少哪个参考?
  • 你需要一个using System.Linq;
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多