我在团结项目中工作,即时通讯使用字典来存储玩家信息,然后为玩家分配一个userID int,这是我试图在字典中使玩家信息的索引位置,但我想即时通讯试图使用这个系统完全错误。目前我有这个代码:
public class Players : IComparable<Players> {
public int userID;
public string userName;
public int userHealth;
public GameObject userPlayer;
public Players(int newID,string Name,int Health,GameObject player){
userID = newID;
userName = Name;
userHealth = Health;
userPlayer = player;
}
public int CompareTo(Players other){
if(other == null){
return 1;
}
return userID - other.userID;
}
}
创建我使用的词典
private Dictionary<NetworkPlayer, Players> playerList = new Dictionary<NetworkPlayer,Players>();
添加到我使用
playerList.Add(player,new Players(playerList.Count,"Test", 100, playerObj));
我希望使用playerList.Count
部分作为索引它的方法,然后通过这个索引对其进行排序以获得我想要的玩家...有没有办法正确地做到这一点?这是我第一次尝试在c#中使用dictionarys,我很难理解它们是如何工作的,如果有人可以帮我引导我这样做的工作方法。我需要做的就是根据索引或使用NetworkPlayer类返回数据。
如果有人能帮助我找到一个有效的方法,那就感激不尽了,谢谢。
答案 0 :(得分:4)
标准字典的项目不以这种方式排序。通常情况下,如果你想通过一个特定的ID拉出玩家,最好把它作为字典中的密钥,即:
private Dictionary<int, Players> playersByID = new Dictionary<int, Players>();
private Dictionary<NetworkPlayer, Players> playersByNetwork = new Dictionary<NetworkPlayer, Players>();
请注意,您可以存储两个词典,每个词典对应一种查找形式:
然后你可以存储:
int id = nextID; // Using ID counter...
var newPlayer = new Players(id, "Test", 100, playerObj);
playersById.Add(id, newPlayer);
playersByNetwork.Add(player, newPlayer);
通过以下方式获取:
var player = playersById[120];
或通过:
var player = playersByNetwork[netPlayer];
旁注:我没有使用Count
作为ID,因为如果您删除了玩家,那将失败...如果这是您在系统中永远不会做的事情,那么您可以去返回使用Count
属性作为下一个ID。
答案 1 :(得分:0)
您也可以通过自己将您感兴趣的键值对封装到 KeyValuePair 中并将其与 int 相关联来索引字典值,如下所示:
Dictionary<int, KeyValuePair<string, int>> indexedDictionary = new Dictionary<int, KeyValuePair<string, int>>
{
{0, new KeyValuePair<string, int>("my entry", 13) },
{1, new KeyValuePair<string, int>("whatever", 5) },
{............}
};