C# 如何按升序对词典排序?

C# 如何按升序对词典排序?,c#,C#,所以我有这本字典 Dictionary<ulong, PlayerData> PlayersCache = new Dictionary<ulong, PlayerData>(); 如何对字典进行排序,使命中率最高的玩家成为第一名,命中率最高的第二名玩家成为第二名,命中率最高的第三名玩家成为第三名。。。在字典中,按升序排序。使用LINQ: var ordered = PlayersCache.OrderByDescending(_ => _.Value.Hits)

所以我有这本字典

Dictionary<ulong, PlayerData> PlayersCache = new Dictionary<ulong, PlayerData>();
如何对字典进行排序,使命中率最高的玩家成为第一名,命中率最高的第二名玩家成为第二名,命中率最高的第三名玩家成为第三名。。。在字典中,按升序排序。

使用LINQ:

var ordered = PlayersCache.OrderByDescending(_ => _.Value.Hits);

您可以将.ToList()或类似内容添加到end,具体取决于您希望如何使用它

将值ID添加到类:

public class PlayerData
{
    public ulong ID;
    public int Shots;
    public int Hits;
    public PlayerData()
    {
    }
}
排序:

Dictionary<ulong, PlayerData> PlayersCache = new Dictionary<ulong, PlayerData>();

// ... adding records to the dictionary

List<PlayerData> lst = new List<PlayerData>();
foreach (var kv in PlayersCache)
{
    lst.Add(kv.Value);
    kv.Value.ID = kv.Key;
}

lst.Sort(delegate (PlayerData x, PlayerData y) {
    return y.Hits.CompareTo(x.Hits);
});

PlayersCache.Clear();

foreach(var p in lst)
{
    PlayersCache.Add(p.ID, p);
}
Dictionary PlayersCache=new Dictionary();
// ... 向词典中添加记录
List lst=新列表();
foreach(PlayerCache中的var kv)
{
第一次增加(千伏值);
kv.Value.ID=kv.键;
}
一级排序(委托(PlayerData x,PlayerData y){
返回y.Hits.CompareTo(x.Hits);
});
PlayersCache.Clear();
foreach(lst中的var p)
{
PlayersCache.Add(p.ID,p);
}

字典是未排序的(尽管它们是按键值排序的实现)。如果要按值排序,则不要使用字典-请使用中提供的
列表,或使用中提供的排序
查找
,作为半放弃是可以的,但以后请不要作为可用变量。@Sinatr您的观点是有效的,但从这个问题来看,我认为它并不特别重要。我通常是从PlayersCache上读的?foreach(BasePlayer.activePlayerList中的var-aPlayer){if(PlayersCache.ContainsKey(aPlayer.userID)){这部分:
foreach(BasePlayer.activePlayerList中的var-aPlayer){if(PlayersCache.ContainsKey(aPlayer.userID))}
不在您问题中的代码中。您何时执行此代码?我执行此代码是为了为每个玩家创建UI面板等。它位于UnityEngineine中看起来与您的问题无关。您是在排序之前还是之后执行此代码?我每2秒执行一次
Dictionary<ulong, PlayerData> PlayersCache = new Dictionary<ulong, PlayerData>();

// ... adding records to the dictionary

List<PlayerData> lst = new List<PlayerData>();
foreach (var kv in PlayersCache)
{
    lst.Add(kv.Value);
    kv.Value.ID = kv.Key;
}

lst.Sort(delegate (PlayerData x, PlayerData y) {
    return y.Hits.CompareTo(x.Hits);
});

PlayersCache.Clear();

foreach(var p in lst)
{
    PlayersCache.Add(p.ID, p);
}