如何按升序对字典进行排序? [复制]
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<Key, Value>
中的 this answer 或排序后的 Lookup
中提供的 this answer
【讨论】:
以上是关于如何按升序对字典进行排序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章