2013-11-23 54 views
1

我正在製作多人遊戲,我在遊戲中添加玩家有一些問題。我將列表更改爲哈希集,因爲我不想公佈值。採用與(ERROR)C#更改列表哈希集,現在得到錯誤

public class Players 
{ 
    public int ID; 
    public string IP; 
    public string name; 
    public int locationX; 
    public int locationY; 
    public int locationXLatest; 
    public int locationYLatest; 
    public int dir; 
    public bool PlayerConnected = false; 
    public bool PlayerDisconnected = false; 
} 

Addind玩家在遊戲中:一是製造新的HashSet:public static HashSet<Players> PlayersList = new HashSet<Players>();

玩家級使用的foreach(WORKING遊戲

for (int i = 0; i < Globals.Globals.PlayersList.Count; i++) 
{ 
    var ent = Globals.Globals.PlayersList[i]; //<-- ERROR! WORKING IF USING LIST BUT GETTING THIS ERROR IF I'M USING HASHSET: Cannot apply indexing with [] to an expression of type 'System.Collections.Generic.HashSet<Players> 

    if (ent.name != null && !ent.PlayerConnected && !ent.PlayerDisconnected) 
    { 
     ent.PlayerConnected = true; 
     //My secret code :D Addind player in game :3 
    } 
} 

Addind的球員,但如果LIST改進 - > CRASH)

foreach (var ent in Globals.Globals.PlayersList) 
{ 
    if (ent.name != null && !ent.PlayerConnected && !ent.PlayerDisconnected) 
    { 
     ent.PlayerConnected = true; 
     //My secret code :D Addind player in game :3 
    } 
} 

工作正常,如果使用列表,但新的列表項是因爲玩家添加循環檢查連接是否打開,所有的時間都是垃圾郵件。或者它可能使用列表,但沒有獲得雙重值?我嘗試做檢查是玩家添加,但然後玩家沒有顯示...

+0

無需初始化'PlayerConnected'和'PlayerDisconnected'到'假'。他們默認已經是'假'了。 – haim770

回答

0

您是否嘗試過在您的調用結束時添加.ToArray()來緩存迭代時的列表?

foreach (var ent in Globals.Globals.PlayersList.ToArray()) 
... 

此外,如果你想確保玩家每ID唯一,你可以用ID作爲關鍵將它們添加到字典代替,或實現Player類哈希碼。

Dictionary<int, Players> PlayersList; 

然後遍歷他們是這樣的:

foreach (var ent in Globals.Globals.PlayersList.Values) 

同樣,你可能需要使用.ToArray()如果​​你在循環內修改PlayersList。

+0

謝謝! ITS NOWINDIND PLAYER ONCE <33但它的一次展示「一個具有相同密鑰的項目已被添加。」錯誤...我想隱藏它:( – user3025773

+0

)如果玩家已經在字典中,你可以在添加之前檢查。使用'PlayersList.ContainsKey(ID)' – johv

+0

謝謝!它現在工作完美:3 – user3025773

0

HashSet不包含索引器。既然你不關心該組中的Player位置是什麼,你可以簡單地使用foreach相反,它會爲你節省一些代碼行,以及:

foreach (var player in Globals.Globals.PlayersList) 
{ 
    if (player.name != null && !player.PlayerConnected && !player.PlayerDisconnected) 
    { 
     player.PlayerConnected = true; 
     //My secret code :D Addind player in game :3 
    } 
}