收藏已修改;枚举操作可能无法执行

Posted

技术标签:

【中文标题】收藏已修改;枚举操作可能无法执行【英文标题】: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
        
    

【问题讨论】:

Why am I getting "Collection was modified; enumeration operation may not execute" when not modifying the enumerated collection?的可能重复 【参考方案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.

【讨论】:

以上是关于收藏已修改;枚举操作可能无法执行的主要内容,如果未能解决你的问题,请参考以下文章

收藏已修改;枚举操作可能无法执行

收藏已修改;枚举操作可能无法执行(带锁的多线程)

收藏已修改;枚举操作可能无法执行。到处都在使用锁怎么可能?

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

C# - 集合已修改;枚举操作可能无法执行

集合已修改,可能无法执行枚举操作