枚举错误;可能无法执行

本文关键字:执行 错误 枚举 | 更新日期: 2023-09-27 18:23:48

集合已修改;枚举操作可能无法执行。

我在运行程序时会出现这个错误。我有一本字典,当我修改它时,我无法从中枚举。

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

枚举错误;可能无法执行

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

这适合你的需要吗?

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

在迭代任何集合时,都不能修改(添加、更新或删除)任何集合。它在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);
}