如何按升序对字典进行排序? [复制]

Posted

技术标签:

【中文标题】如何按升序对字典进行排序? [复制]【英文标题】:How to sort Dictionary by ascending? [duplicate] 【发布时间】:2020-08-03 02:40:23 【问题描述】:

所以我有这本词典

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

我有类 PlayerData

        public class PlayerData
        
            public int Shots;
            public int Hits;
            public PlayerData()
            
            
        

我如何对字典进行排序,这样点击次数最多的玩家将是第一名,点击次数最多的第二名玩家将排名第二,点击次数最多的第三名玩家将排名第三...在字典中按升序排序。

【问题讨论】:

【参考方案1】:

给类添加一个值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);

【讨论】:

我从 PlayersCache 中正常读取? foreach (var aPlayer in BasePlayer.activePlayerList) if (PlayersCache.ContainsKey(aPlayer.userID)) 这部分:foreach (var aPlayer in BasePlayer.activePlayerList) if (PlayersCache.ContainsKey(aPlayer.userID)) 不在您问题的代码中。你什么时候执行这段代码? 我执行它为每个玩家创建 UI 面板等...它在 UnityEngine 中 看起来这与您的问题无关。你是在排序之前还是之后执行的? 我每2秒执行一次看imgur.com/qVyyaOu.png【参考方案2】:

使用 LINQ:

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

您可以添加 .ToList() 或类似的结束取决于您希望如何使用它。

【讨论】:

_ 作为半丢弃是可以的,但以后请不要作为可用的变量。 @Sinatr 你的观点是正确的,但从这个问题来看,我认为这并不是特别重要。【参考方案3】:

字典是未排序的(尽管这是按 key 值排序的实现)。如果您想按值排序,请不要使用字典 - 使用 List&lt;Key, Value&gt; 中的 this answer 或排序后的 Lookup 中提供的 this answer

【讨论】:

以上是关于如何按升序对字典进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何按字典中的值对字典列表进行排序? [复制]

如何在 Python 中对字典列表进行多重排序? [复制]

如何按整数属性对类列表进行排序? [复制]

如何在页面加载时按字母顺序对 HTML 列表的内容进行排序? [复制]

如何按值对 Python 字典进行排序? [复制]

在 C# 中按名称和日期作为键对字典进行排序? [复制]