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

时间:2013-06-10 13:27:59

标签: 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);

我使用了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
 }

方法3:

 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

3 个答案:

答案 0 :(得分:10)

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

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

修改 Magnus在评论中提出了SortedDictionary class

答案 1 :(得分: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);
    }
);

答案 2 :(得分: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();
        }