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