2013-07-18 48 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); 
} 
相關問題