枚举错误;可能无法执行

时间:2013-07-18 09:55:09

标签: c# xna iteration

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

我运行程序时遇到错误。 我有一本字典,当我修改它时,我无法从中进行枚举。

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])));

3 个答案:

答案 0 :(得分:1)

您也可以尝试使用普通的for循环而不是foreach。 这样你可以规避警告,因为你没有使用枚举选项。

对于你要做的字典:

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

这是否符合您的需求?

答案 1 :(得分:0)

在迭代任何集合时,您无法修改(添加,更新或删除)任何集合。它在c#中受到限制。

您需要修改代码,以便在列表中单独保留任何更新。您可以为循环期间所做的任何更改以及loop.e.g之后的合并保留单独的记录。

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

答案 2 :(得分: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);
}