收藏已修改;枚举操作可能无法执行
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.
【讨论】:
以上是关于收藏已修改;枚举操作可能无法执行的主要内容,如果未能解决你的问题,请参考以下文章