按人类排序顺序的值对字典进行排序
本文关键字:排序 字典 人类 顺序 | 更新日期: 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();
}