我想基于其值对字典进行排序并获取结果字典
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
答案 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();
}