【发布时间】:2021-10-14 23:31:56
【问题描述】:
我正在尝试从字典中获取前 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);
如果我想要前 3 名,我需要获得
dict.Add("BBB", 97);
dict.Add("CCC", 98);
dict.Add("EEE", 97);
dict.Add("FFF", 100);
因为 BBB 和 EEE 具有相同的等级。我首先按排名对字典进行排序,并尝试了Take(),但只取了两者之一。
/* Does not work */
var dictSorted = dict.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value).Take(3);
/* The below only prints
FFF = 100
CCC = 98
BBB = 97
but not
EEE = 97
*/
foreach(KeyValuePair kvp in dictSorted){
Console.WriteLine(kvp.Key + " = " + kvp.Value);
}
有没有什么好的方法可以做到这一点?
[编辑] 抱歉我的问题不清楚。我想说的是, 我需要保持前 3 个不同的排名。如果有并列,则都需要包括在内,但仍处于同一排名内。
例如,如果候选人是:
100、100、100、99、99、98、98、97、97、96,
那么,我需要 100、100、100、99、99、98、98,因为这些是前 3 个不同排名。我正在使用字典,因为每个等级都与 AAA、BBB、CCC 等名称相关联。 从技术上讲,在上面的示例中,top 3 通常意味着 100、100、100 仅此而已,但就我而言,它需要是前 3 个“不同”排名。
【问题讨论】:
-
.OrderByDescending(x => x.Value).Take(3)? -
我想我不需要那行代码的后半部分。
-
@JeremyLakeman 我删除了“ToDictionary....”并且代码产生了相同的结果,所以我删除了它。但它仍然没有保持相同排名的条目。它只打印 3 个条目。
-
编写你自己的
.Take方法来不断检查后续元素是否相等。 -
听起来您使用的数据结构完全错误。您可能想要
SortedList或类似名称。字典是一种哈希表,没有保证的顺序
标签: c# dictionary