所以基本上我遇到了我已经完成的任务的问题。我不会向你介绍任务本身的细节,所以我只会给你相关的信息。
我有一本字典,我需要按最高的int [value]排序,准确地排在前五位,我需要能够显示底部的五位。
Dictionary<string, int> dict = new Dictionary<string, int>();
字符串(键)包含已为文本文件读取的单词。整数(值)包含文档中提到它们的次数。
我打算用另一种方式做,但我被告知要用字典做,所以请字典只帮助。 我很感激,如果你能解释它应该怎么做,这样我就可以学习并完成任务,因为任务的目的是教育自己,但我发现它有点难......
我提前感谢您的帮助,如果需要更多信息,请告诉我,我会发布!
答案 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>