2013-07-18 51 views
-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]))); 
+2

这段代码几乎没有任何意义,只是给它添加上下文。顺便说一句:使用C#支架造型;球员不是参数,那么为什么低字母? – wudzik

+0

Java习惯,我试图解决它。 –

回答

0

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

您需要修改代码,以便在列表中单独更新任何更新。你可以保持一个单独的记录为循环过程中,您所作的任何更改和loop.eg后合并

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

有没有其他的方式来获得它,所以我可以做到这一点? –

+0

@BrandonWoolworth查看我更新的答案。 – Ehsan

+0

@BrandonWoolworth我已经发布了完整的解决方案。 – Ehsan

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

这是否满足您的需求?

+0

同样的错误,即使当我使用正常的循环。 –

+0

我刚刚注意到我仍然在我的代码示例中使用了一个foreach。我改变它,所以它实际上使用for循环。 – user1847879

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); 
} 
相关问题