按值对字典(string, int)进行排序

14

基本上,我在完成分配给我的任务时遇到了问题。为了不让您感到无聊,我将只提供相关信息。

我有一个需要按照int[value]最高值排序的字典,确切地说是需要显示前五个最高值,并且还需要显示最低的五个。

Dictionary<string, int> dict = new Dictionary<string, int>();

这些字符串(键)包含从文本文件中读取的单词。整数(值)包含在文档中提到的次数。

我原本打算用另一种方法完成,但被告知要使用字典,所以只能使用字典。如果您可以解释应该如何完成任务,我将不胜感激,因为任务的目的是让我学习,但我发现有点困难...

非常感谢您的帮助,如果需要更多信息,请告诉我,我会发布它!

3个回答

35

字典本身没有固定的排序方式。但如果你想获取最高(或最低)数值的前五条记录,可以使用一些 Linq:

using System.Linq;

...

var top5 = dict.OrderByDescending(pair => pair.Value).Take(5);
var bottom5 = dict.OrderBy(pair => pair.Value).Take(5);

这将返回一个IEnumerable<KeyValuePair<string, int>>。要将其转换回字典,LINQ可以再次提供帮助。例如:

var top5 = dict.OrderByDescending(pair => pair.Value).Take(5)
               .ToDictionary(pair => pair.Key, pair => pair.Value);

现在,top5 是一个 Dictionary<string, int>,它仅包含来自 dict 中具有最高值的 5 个元素。


1
给大家留言:非常感谢你们的帮助!另外,我想知道 "=>" 是什么意思,因为 MSDN 上的描述对于像我这样的新手来说有点困惑。 - Zain
@user3245390 这是一个lambda表达式pair => pair.Value 创建了一个匿名方法,接受单个参数 pair,并返回 pair.Value - p.s.w.g
为什么不直接使用SortedDictionary<TKey, TValue>呢? - GDB
1
@GDB 从MSDN中得知,SortedDictionary代表一个按照排序的键值对集合。-- OP希望根据值来排序结果。 - p.s.w.g

4
你需要从字典中获取有序结果,由于你想要前五名,所以你需要使用Take,例如:
//Top 5
foreach (var item in dict.OrderByDescending(r => r.Value).Take(5))
{
    Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
}

你需要 OrderBy 的原因是:

Dictionary<TKey, TValue> 类

为了枚举的目的,字典中的每个项都被视为表示值和其键的 KeyValuePair 结构。 返回项的顺序是未定义的。


3

如果您正在使用C# 3.0及以上版本

您可以使用LINQ来执行以下操作

foreach (KeyValuePair<string,int> item in keywordCounts.OrderBy(key=> key.Value).Take(5))
{ 
    // do something with item.Key and item.Value
}

如果您正在使用C# 2.0
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort((firstPair,nextPair) =>
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

或者它可以被重写为:
myList.Sort((x,y)=>x.Value.CompareTo(y.Value));

LINQ 允许极大的灵活性,您可以选择前 10、20、10% 等。如果您正在使用单词频率索引进行类型前置预测,也可以包括 StartsWith 子句。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接