按值排序字典(字符串,整数)

时间:2014-01-28 16:33:23

标签: c# sorting

所以基本上我遇到了我已经完成的任务的问题。我不会向你介绍任务本身的细节,所以我只会给你相关的信息。

我有一本字典,我需要按最高的int [value]排序,准确地排在前五位,我需要能够显示底部的五位。

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

字符串(键)包含已为文本文件读取的单词。整数(值)包含文档中提到它们的次数。

我打算用另一种方式做,但我被告知要用字典做,所以请字典只帮助。 我很感激,如果你能解释它应该怎么做,这样我就可以学习并完成任务,因为任务的目的是教育自己,但我发现它有点难......

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

3 个答案:

答案 0 :(得分:29)

字典没有任何固有的顺序。但是如果你想获得具有最高(或最低)值的前5个条目,你可以使用一点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 :(得分:4)

您需要从字典中获取有序结果,因为您正在寻找前5名,所以您需要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> Class

  

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

答案 2 :(得分: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子句。 / p>