枚举错误;可能无法执行
本文关键字:执行 错误 枚举 | 更新日期: 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);
}