按人类排序顺序中的值排序字典

Pan*_*kaj 1 c#

我想根据其值对字典进行排序并获取结果字典

Dictionary<String, Int32> outputDictionary = new Dictionary<String, Int32>();
outputDictionary.Add("MyFirstValue", 1);
outputDictionary.Add("MySecondValue",2);
outputDictionary.Add("MyThirdValue", 10);
outputDictionary.Add("MyFourthValue", 20);
outputDictionary.Add("MyFifthValue", 5);
Run Code Online (Sandbox Code Playgroud)

我用3种方法按值排序

方法1:

outputDictionary = outputDictionary.OrderBy(key => key.Value).ToDictionary(pair =>   pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

方法2:

  foreach (KeyValuePair<String, String> item in outputDictionary.OrderBy(key => key.Value))
 {
   // do something with item.Key and item.Value
 }
Run Code Online (Sandbox Code Playgroud)

方法3:

 outputDictionary = (from entry in outputDictionary orderby entry.Value ascending   select entry).ToDictionary(pair => pair.Key, pair => pair.Value);
Run Code Online (Sandbox Code Playgroud)

但无论我选择何种方法,我都会得到结果

 MyFirstValue, 1
 MyThirdValue, 10
 MySecondValue, 2
 MyFourthValue, 20
 MyFifthValue, 5
Run Code Online (Sandbox Code Playgroud)

我想要的地方

  MyFirstValue, 1
  MySecondValue, 2
  MyFifthValue, 5
  MyThirdValue, 10
  MyFourthValue, 20
Run Code Online (Sandbox Code Playgroud)

Ren*_*nan 10

根据定义,字典不可排序.从抽象的意义上讲,对于检索订单元素没有任何保证.有些代码可以按顺序获取项目 - 我在Linq中不是那么流利,但我认为你的代码可以做到这一点 - 但是如果你要大量使用这些数据,那么效率低于已经排序结构可用于迭代.我建议使用其他类型或类型集,例如a List<KeyValuePair<string, string>>.

你也可以创建KeyValuePair一个整数的元素(即:)KeyValuePair<string, int>,因为这是你想要排序的.字符串比较是按字母顺序排列的.按字母顺序排列,20确实在5之前.

编辑: Magnus在评论中提出了SortedDictionary类.