2012-03-15 94 views
3

プレイヤーが生きていない場合にプレイヤーを削除するこのコードがありますが、問題はループ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

[なぜ私は "コレクションが変更されていますか?列挙されたコレクションを変更していないときに列挙操作が実行されないことがありますか?](http://stackoverflow.com/questions/2791503/why-am-i-getting-collection-was-modified-enumeration-operation-may-not-execute ) – nawfal

答えて

3

クエリ選手は削除するためのコレクション:

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

そして、プレイヤーを削除します。

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

どこから解決できないようです - どの参考資料が見つからないのか分かりませんか? – Michael

+1

'System.Linq'で使用する必要があります。すでに' System.Core'への参照があると思います。 – jason

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); 
} 
+0

'Where'を解決できないようです - どのリファレンスが紛失しているのかわかりません – Michael

+1

' System.Linq;を使用する必要があります –

0

あなたがのために逆を使用して、コレクションの要素を削除する必要があります。

for(int i = numPlayers.Values.Count - 1; i <= 0; i--) 
{ 
//Remove it. 
} 
関連する問題