How to sort a dictionary by key
我有字典
关键是c1,c3,c2,t1,,t4,t2。我想把它们分类为c1,c2,c3,t1,t2,t3。
我想用
1 | Input.OrderBy(key => key.Key ); |
但它不起作用
知道怎么解决这个问题吗
也许ordereddictionary会给你想要的。
或者使用通用的SortedDictionary
将未排序的对象加载到SortedDictionary对象中,如下所示:
1 | SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData); |
其中unsortedcustomerdata是相同的泛型类型(字典字符串、字符串或在您的case字符串、point中)。它将按键自动对新对象排序
根据msdn:SortedDictionary(IDictionary):初始化SortedDictionary类的新实例,该实例包含从指定IDictionary复制的元素,并使用键类型的默认IComparer实现。
只是一个猜测,但看起来您假设它将对输入进行排序。orderby方法实际上返回了包含相同值的iorderenumerable的有序实例。如果要保留返回值,可以执行以下操作:
1 2 | IOrderedEnumerable orderedInput orderedInput = Input.OrderBy(key=>key.Key) |
大多数修改集合的方法都遵循相同的模式。这样做是为了不更改原始集合实例。这可以防止您在不想更改实例时意外更改实例。如果您只想使用已排序的实例,那么只需将变量设置为方法的返回,如上图所示。
由于input.orderby创建了一个按顺序返回项目的查询,所以只需将其分配给同一个字典即可。
下面的代码使用另外两个列表对字典进行排序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | using System; using System.Collections.Generic; using System.Drawing; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Dictionary<string,Point> r=new Dictionary<string,Point>(); r.Add("c3",new Point(0,1)); r.Add("c1",new Point(1,2)); r.Add("t3",new Point(2,3)); r.Add("c4",new Point(3,4)); r.Add("c2",new Point(4,5)); r.Add("t1",new Point(5,6)); r.Add("t2",new Point(6,7)); // Create a list of keys List<string> zlk=new List<string>(r.Keys); // and then sort it. zlk.Sort(); List<Point> zlv=new List<Point>(); // Readd with the order. foreach(var item in zlk) { zlv.Add(r[item]); } r.Clear(); for(int i=0;i<zlk.Count;i++) { r[zlk[i]]=zlv[i]; } // test output foreach(var item in r.Keys) { Console.WriteLine(item+""+r[item].X+""+r[item].Y); } Console.ReadKey(true); } } } |
上面代码的输出如下所示。
1 2 3 4 5 6 7 | c1 1 2 c2 4 5 c3 0 1 c4 3 4 t1 5 6 t2 6 7 t3 2 3 |
我用过
1 | var l = Input.OrderBy(key => key.Key); |
我把它改成了字典
好的,检查一下,应该可以用了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var r = new Dictionary<string, Point>(); r.Add("c3", new Point(0, 0)); r.Add("c1", new Point(0, 0)); r.Add("t3", new Point(0, 0)); r.Add("c4", new Point(0, 0)); r.Add("c2", new Point(0, 0)); r.Add("t1", new Point(0, 0)); r.Add("t2", new Point(0, 0)); var l = r.OrderBy(key => key.Key); var dic = l.ToDictionary((keyItem) => keyItem.Key, (valueItem) => valueItem.Value); foreach (var item in dic) { Console.WriteLine(item.Key); } Console.ReadLine(); |