CSharp - 你如何通过值对字典进行排序呢?

  显示原文与译文双语对照的内容

我通常需要按值排序字典,由键值&值组成。 例如我有一个单词和各自的频率的哈希,我想把频率 ORDER BY 。

有一个 SortedList,它适合一个值( 说出频率),我想把它映射回单词。

SortedDictionary 订单通过键,而不是值。 一些求助于自定义类的方法,但是否有更清晰的方法?

时间:


List<KeyValuePair<string, string>> myList = aDictionary.ToList();

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

由于你是针对. NET 2.0或者更高版本的,你可以将它的简化为lambda语法--它是等价但较短的。 如果你是针对. NET 2.0的,那么你只能使用这个语法,如果你正在使用来自 vs2008 ( 或者上或者)的编译器。


List<KeyValuePair<string, string>> myList = aDictionary.ToList();

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

为什么不使用 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 子句。

环顾四周,使用一些 C# 3.0特性,我们可以这样做:


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

这是我见过的最干净的方式,类似于 ruby 处理哈希的方式。

你可以按值对字典进行排序,并将它的保存回( 当你越过它的时候,这些值就会按顺序出来):


dict = dict.OrderBy(x => x.Value).ToDictionary(x => x.Key, x => x.Value);

当然,这可能不正确,但它可以。

在一个高层次上,你没有其他选择去遍历整个字典并查看每个值。

也许这有助于:http://bytes.com/forum/thread563638.html 从 John Timney复制/粘贴:


Dictionary<string, string> s = new Dictionary<string, string>();
s.Add("1","a Item");
s.Add("2","c Item");
s.Add("3","b Item");

List<KeyValuePair<string, string>> myList = new List<KeyValuePair<string, string>>(s);
myList.Sort(
 delegate(KeyValuePair<string, string> firstPair,
 KeyValuePair<string, string> nextPair)
 {
 return firstPair.Value.CompareTo(nextPair.Value);
 }
);

或者有趣的是,你可以使用一些LINQ扩展:


var dictionary = new Dictionary<string, int> { {"c", 3 }, {"a", 1 }, {"b", 2 } };
dictionary.OrderBy(x => x.Value)
. ForEach(x => Console.WriteLine("{0}={1}", x.Key,x.Value));

排序值

这里演示如何对字典中的值进行排序。 我们看到一个可以在 Visual Studio 中编译并运行的控制台程序。 它将关键字添加到字典中,然后按它们的值排序。 记住字典实例最初不是以任何方式排序的。 我们在查询语句中使用了 LINQ orderby关键字。

排序字典 [C# ]的OrderBy子句程序


using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
 static void Main()
 {
//Example dictionary.
 var dictionary = new Dictionary<string, int>(5);
 dictionary.Add("cat", 1);
 dictionary.Add("dog", 0);
 dictionary.Add("mouse", 5);
 dictionary.Add("eel", 3);
 dictionary.Add("programmer", 2);

//Order by values.
//... Use LINQ to specify sorting by value.
 var items = from pair in dictionary
 orderby pair.Value ascending
 select pair;

//Display results.
 foreach (KeyValuePair<string, int> pair in items)
 {
 Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
 }

//Reverse sort.
//... Can be looped over in the same way as 上面.
 items = from pair in dictionary
 orderby pair.Value descending
 select pair;
 }
}

输出


dog: 0
cat: 1
programmer: 2
eel: 3
mouse: 5

使用排列有 SortedDictionary List 来绑定到一个 ListView control:


Dim MyDictionary As SortedDictionary(Of String, MyDictionaryEntry)

MyDictionaryListView.ItemsSource = MyDictionary.Values.OrderByDescending(Function(entry) entry.MyValue)

Public Class MyDictionaryEntry ' Need Property for GridViewColumn DisplayMemberBinding
 Public Property MyString As String
 Public Property MyValue As Integer
End Class

XAML:


<ListView Name="MyDictionaryListView">
 <ListView.View>
 <GridView>
 <GridViewColumn DisplayMemberBinding="{Binding Path=MyString}" Header="MyStringColumnName"></GridViewColumn>
 <GridViewColumn DisplayMemberBinding="{Binding Path=MyValue}" Header="MyValueColumnName"></GridViewColumn>
 </GridView>
 </ListView.View>
</ListView>

...