-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

您也可以尝试使用普通的 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);
}

这符合您的需求吗?

于 2013-07-18T10:13:47.250 回答
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 回答
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 回答