关于C#:如何按键对字典排序

How to sort a dictionary by key

我有字典Dictionary

关键是c1,c3,c2,t1,,t4,t2。我想把它们分类为c1,c2,c3,t1,t2,t3。

我想用

1
Input.OrderBy(key => key.Key );

但它不起作用

知道怎么解决这个问题吗


Input.OrderBy不对字典进行排序,它创建一个按顺序返回项目的查询。

也许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创建了一个按顺序返回项目的查询,所以只需将其分配给同一个字典即可。

objectDict = objectDict.OrderBy(obj => obj.Key).ToDictionary(obj => obj.Key, obj => obj.Value);


下面的代码使用另外两个列表对字典进行排序。

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();