收藏被修改;枚举操作可能无法执行。
我运行程序时遇到错误。 我有一本字典,当我修改它时,我无法从中进行枚举。
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])));
答案 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);
}