-3

コレクションが変更されました。列挙操作が実行されない場合があります。

プログラムを実行すると、そのエラーが発生します。私は辞書を持っていますが、それを変更すると列挙できません。

public void Render() {
    foreach (var pair in players ) {
       Main.SpriteBatch.DrawString(Main.BigFont, pair.Key, pair.Value, Color.White);
    }
}

値を変更するか、完全に削除しようとしましたが、再度追加する必要があります。

 byte[] data = client.EndReceive(ar, ref ip);
        string str_data = Encoding.ASCII.GetString(data);
        string[] coords = str_data.Split(";".ToCharArray());
        if (players.ContainsKey(coords[0])) {
            players.Remove(coords[0]);
        }
        players.Add(coords[0], new Vector2(Int32.Parse(coords[1]), Int32.Parse(coords[2])));
4

3 に答える 3

1

foreach の代わりに通常の for ループを使用することもできます。列挙オプションを使用していないため、この方法で警告を回避できます。

辞書の場合、次のようにします。

List<string/*or other datatype*/> keys = players.Keys.ToList();
for (int i = 0; i < keys.Count; i++)
{
   Main.SpriteBatch.DrawString(Main.BigFont, keys[i], players[keys[i]], Color.White);
}

これはあなたのニーズに合っていますか?

于 2013-07-18T10:13:47.250 に答える
0

コレクションを繰り返し処理している間は、コレクションを変更 (追加、更新、または削除) することはできません。これは c# で制限されています。

リストの更新を個別に保持するように、コードを変更する必要があります。ループ中に行った変更について個別の記録を保持し、ループ後にマージできます。

var itemsToDelete = new Dictionary<int,Player>(); 

次に、この行を変更します

    if (players.ContainsKey(coords[0])) {
        players.Remove(coords[0]);
    }

  if (players.ContainsKey(coords[0])) {
        itemsToDelete.Add(coords[0]);
    }

その後、ループの後

 foreach (var key in itemsToDelete)
{
   players.Remove(key);
}
于 2013-07-18T10:00:39.203 に答える
0
var ToBeDeleted = new List<player>(); //Or whatever type was the list players holding

if (players.ContainsKey(coords[0])) {
            ToBeDeleted.Add(coords[0]);
        }

foreach(var item in ToBeDeleted)
{
players.Remove(item);
}
于 2013-07-18T10:14:25.537 に答える