按人类排序顺序的值对字典进行排序

本文关键字:排序 字典 人类 顺序 | 更新日期: 2023-09-27 18:17:55

我想根据它的值对字典进行排序,并得到一个结果字典

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种方法来按值排序

方法1:

outputDictionary = outputDictionary.OrderBy(key => key.Value).ToDictionary(pair =>   pair.Key, pair => pair.Value);
方法2:

  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

Where as I want

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

按人类排序顺序的值对字典进行排序

根据定义,字典是不可排序的。从抽象的意义上说,对检索元素的顺序没有任何保证。有一些代码可以以有序的方式获取项目——我对Linq不是很熟练,但我认为你的代码可以做到这一点——但如果你要经常使用这些数据,这比使用一个已经排序的结构来迭代效率要低。我建议使用其他类型或类型集,如List<KeyValuePair<string, string>>

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

edit: Magnus在评论中建议使用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);
    }
);

嗨,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();
        }