协慌网

登录 贡献 社区

你如何按价值排序字典?

我经常需要按值排序字典,包括键和值。例如,我有一个单词的散列和各自的频率,我想按频率排序。

有一个SortedList适用于单个值(比如频率),我想将它映射回单词。

SortedDictionary按键排序 ,而不是值。有些人诉诸于自定义课程 ,但是有更清洁的方法吗?

答案

使用 LINQ:

Dictionary<string, int> myDict = new Dictionary<string, int>();
myDict.Add("one", 1);
myDict.Add("four", 4);
myDict.Add("two", 2);
myDict.Add("three", 3);

var sortedDict = from entry in myDict orderby entry.Value ascending select entry;

这也可以提供很大的灵活性,你可以选择前 10 个,20 个 10%等。或者如果你使用你的单词频率索引进行type-ahead ,你也可以包括StartsWith子句。

使用:

using System.Linq.Enumerable;
...
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> pair1,
    KeyValuePair<string, string> pair2)
    {
        return pair1.Value.CompareTo(pair2.Value);
    }
);

由于您的目标是. NET 2.0 或更高版本,因此您可以将其简化为 lambda 语法 - 它等效,但更短。如果您的目标是. NET 2.0,那么只有在使用 Visual Studio 2008(或更高版本)的编译器时才能使用此语法。

var myList = aDictionary.ToList();

myList.Sort((pair1,pair2) => pair1.Value.CompareTo(pair2.Value));
var ordered = dict.OrderBy(x => x.Value);