1

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

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);

我使用了 3 种方法按值排序

方法一:

outputDictionary = outputDictionary.OrderBy(key => key.Value).ToDictionary(pair =>   pair.Key, pair => pair.Value);

方法二:

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

方法三:

 outputDictionary = (from entry in outputDictionary orderby entry.Value ascending   select entry).ToDictionary(pair => pair.Key, pair => pair.Value);

但无论我选择什么方法,我都会得到结果

 MyFirstValue, 1
 MyThirdValue, 10
 MySecondValue, 2
 MyFourthValue, 20
 MyFifthValue, 5

随心所欲

  MyFirstValue, 1
  MySecondValue, 2
  MyFifthValue, 5
  MyThirdValue, 10
  MyFourthValue, 20
4

3 回答 3

10

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

您还可以制作整数的任KeyValuePair一元素(即:)KeyValuePair<string, int>,因为这是您想要排序的内容。字符串比较是按字母顺序进行的。按字母顺序,20 确实在 5 之前。

编辑: Magnus在评论中建议了SortedDictionary 类

于 2013-06-10T13:30:35.810 回答
0
List<KeyValuePair<string, string>> myList = aDictionary.ToList();

myList.Sort(
    delegate(KeyValuePair<string, string> firstPair,
    KeyValuePair<string, string> nextPair)
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);
于 2013-06-10T13:30:34.683 回答
0

嗨 Pankaj,你可以试试这个,而不是“MyFirstValue”,我冒昧地更改为“1º 值”并以未排序的顺序添加,输出是有序的

static void Main(string[] args)
        {

            Dictionary<String, Int32> outputDictionary = new Dictionary<String, Int32>();
            outputDictionary.Add("3º value", 1);
            outputDictionary.Add("2º value", 2);
            outputDictionary.Add("1º value", 10);
            outputDictionary.Add("5º value", 20);
            outputDictionary.Add("4º value", 5);
            outputDictionary.Add("14º value", 8);
            outputDictionary.Add("10º value", 22);

            IOrderedEnumerable<KeyValuePair<string,int>> NewOrder = outputDictionary.OrderBy(k => int.Parse(Regex.Match(k.Key, @"\d+").Value));

            foreach (var item in NewOrder)
            {
                Console.WriteLine(item.Key + " " + item.Value.ToString());
            }
            Console.ReadKey();
        }
于 2013-06-10T14:26:53.440 回答