如何按键对字典进行排序

Posted

技术标签:

【中文标题】如何按键对字典进行排序【英文标题】:How to sort a dictionary by key 【发布时间】:2011-11-13 07:45:55 【问题描述】:

我有字典Dictionary<string, Point>

键是 c1,c3,c2,t1,,t4,t2 我想将它们排序为 c1,c2,c3,t1,t2,t3

我正在尝试使用它对其进行排序

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

但它不起作用

知道如何解决这个问题

【问题讨论】:

它根本没有排序,还是没有按照您期望的顺序排序? ***.com/questions/289/… 参考这个它有一些非常好的例子。 好的,我在下面的答案中应该对你有用。 重复***.com/questions/2705607/… 【参考方案1】:

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

也许OrderedDictionary 会给你你想要的。

或者使用通用SortedDictionary

【讨论】:

@AMH 在实际测试之前不要对性能做出假设(微基准不计算在内)。 另一种情况,人们来到这里寻找的实际答案低于“正确”答案,该答案被低估为 0 以下,并且 cmets 争论不相关的考虑。【参考方案2】:

将未排序的对象加载到 SortedDictionary 对象中,如下所示:

SortedDictionary<string, string> sortedCustomerData = new SortedDictionary<string,string>(unsortedCustomerData);

其中 unsortedCustomerData 是相同的泛型类型(字典字符串、字符串或在您的情况下为字符串、点)。它会自动按键排序新对象

根据 msdn:SortedDictionary(IDictionary):初始化 SortedDictionary 类的新实例,该类包含从指定 IDictionary 复制的元素,并为键类型使用默认的 IComparer 实现。

【讨论】:

可能旧了,但是谢谢,工作得很好,而且只有一个班轮。【参考方案3】:

由于 Input.OrderBy 创建了一个以有序顺序返回项目的查询,因此只需将其分配给同一个字典。

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

【讨论】:

【参考方案4】:

只是一个猜测,但看起来您假设它将对输入进行排序。 OrderBy 方法实际上返回包含相同值的 IOrderedEnumerable 的有序实例。如果要保留返回值,可以执行以下操作:

IOrderedEnumerable orderedInput
orderedInput = Input.OrderBy(key=>key.Key)

大多数修改集合的方法都遵循同样的模式。它这样做是为了不更改原始集合实例。这可以防止您在不打算更改实例时意外更改实例。如果您确实只想使用排序后的实例,那么您只需将变量设置为方法的返回值,如上所示。

【讨论】:

【参考方案5】:

以下代码使用两个lists 到sort 一个字典。

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

上面代码的输出如下所示。

c1 1 2
c2 4 5
c3 0 1
c4 3 4
t1 5 6
t2 6 7
t3 2 3

【讨论】:

【参考方案6】:

我用过

var l =  Input.OrderBy(key => key.Key);

我把它转换成字典

【讨论】:

我说过:这不会对字典进行排序!它创建一个排序的“视图”。【参考方案7】:

好的,检查一下它应该可以工作

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

【讨论】:

-1:这行不通。您刚刚创建了另一个没有排序的字典。它可能适用于小型词典,但最终会失败。 我们在聊天中谈过,我知道他想要什么,所以我帮他解决了他的问题 @DeveloperX - 我的猜测是人们投票反对,因为它没有回答问题。我们看不到聊天,因此人们可能不认为它是对我们看到的问题的有用答案。

以上是关于如何按键对字典进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中按键对字典进行排序

按键列表对字典进行排序

Python对字典分别按键(key)和值(value)进行排序

python怎么对字典进行排序

按键排序字典

按值然后键对字典进行排序