C# 如何从Dictionary中获取含并列的前N个不同排名的所有键值对
实现方案
方案1:分组展开法(推荐)
核心思路是先按分数分组,每个分组对应一个唯一排名,取前N个排名的分组后展开所有条目,天然保留并列数据:
Dictionary<string, int> dict = new Dictionary<string, int>(); dict.Add("AAA", 91); dict.Add("BBB", 97); dict.Add("CCC", 98); dict.Add("DDD", 92); dict.Add("EEE", 97); dict.Add("FFF", 100); int topN = 3; var result = dict .GroupBy(kv => kv.Value) .OrderByDescending(g => g.Key) .Take(topN) .SelectMany(g => g) .ToDictionary(kv => kv.Key, kv => kv.Value); // 输出验证 foreach (var kvp in result) { Console.WriteLine($"{kvp.Key} = {kvp.Value}"); }
运行后输出结果:
FFF = 100 CCC = 98 BBB = 97 EEE = 97
完全符合预期。
方案2:阈值过滤法
先计算出前N个不同排名的最低分数阈值,再过滤所有分数大于等于该阈值的条目:
int topN = 3; // 拿到第N高的分数作为阈值 int cutoffScore = dict .Select(kv => kv.Value) .Distinct() .OrderByDescending(v => v) .Take(topN) .Last(); var result = dict .Where(kv => kv.Value >= cutoffScore) .OrderByDescending(kv => kv.Value) .ToDictionary(kv => kv.Key, kv => kv.Value);
两种方案均支持任意N值,且100%保留并列排名的所有条目。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

