C#: 如何对一个字典进行排序?
在C#中,无法对Dictionary进行排序,因为它本质上是无序的。虽然可以通过检索条目的顺序来实现排序,但这个顺序是特定于实现的,并且不能依赖它在不同版本中的工作方式,因为排序不是其设计功能的一部分。
但是,可以使用SortedList或SortedDictionary,它们都按照键进行排序(如果将IEqualityComparer传递给构造函数,则可以按照可配置的方式进行排序)。SortedList仍然是一个字典,它将键映射到值。它在内部使用列表实现,因此不是通过哈希码查找,而是通过二进制搜索。SortedDictionary类似地基于二进制搜索,但通过树而不是列表。
但是要小心使用SortedList,如果构建一个大的列表(假设项目没有预先排序),它会非常慢。通常应该使用SortedDictionary,或者使用第三方的BDictionary来获得类似于SortedDictionary的性能,同时不失去通过索引或找到最近键的能力。
如果我更关心单个元素的查找,但是次要地想按键顺序枚举,是否需要管理一个单独的键列表?如果这是我期望的用法,那么SortedList和SortedDictionary实际上是错误的工具,对吗?也就是说,如果我只想对字典的键进行排序,怎么办?
优势是避免复杂性。是的,据我所知,没有内置的“已排序和已哈希”集合。请注意,这样的集合使用起来更加困难,因为需要提供相等比较和哈希码函数,以及排序函数。当然,同时保持两个集合也有内存成本。您需要测量二进制搜索与哈希查找在实际数据中的成本 - 除非集合非常庞大,否则可能并不显著。
“二进制搜索与维护哈希相比的优势是什么?” - 哈希表的内存和添加或删除条目时维护它所需的时间。“为什么我关心元素的顺序” - 如果您不关心元素的顺序,只需使用Dictionary(我通常建议使用Dictionary而不是SortedList或SortedDictionary)。“但是次要地想按键顺序枚举” - 当您偶尔需要时,对枚举的KeyValuePairs进行排序非常简单:dict.OrderBy(kv => kv.Key)。
“如果我只想对字典的键进行排序,怎么办?” - 没有这样的事情 - 这是一个范畴错误。数组可以原地排序...除了数组以外的任何东西都不能。 (好吧,有一个例外,即具有可变节点的链表,但是在原地对这样的东西进行排序是疯狂且非常昂贵的。)但是当然可以像这样做:var array = dict.Keys.ToArray(); array.Sort();
“如果我按照Steve的答案,只关心单个元素的查找,但是次要地想按键顺序枚举,是否被束缚于管理一个单独的键列表?” - 在他的答案中没有“单独的键列表”...只是dict.Keys...尽管通常最好通过dict.OrderBy(kv => kv.Key)来操作KeyValuePairs。
在C#中,有一个问题是如何对字典进行排序。有人提出了一个解决方法,即使用`SortedDictionary`。
在stackoverflow论坛上,有人回答了这个问题,并给出了一个解决方案。他建议使用`SortedDictionary`来对字典进行排序。
这个解决方案是使用`SortedDictionary`类来创建一个有序的字典。`SortedDictionary`类是C#中的一个内置类,它可以对字典中的键进行排序。这个类可以使用泛型来指定键和值的类型。
要使用`SortedDictionary`类,需要引用命名空间`System.Collections.Generic`。然后,可以使用`SortedDictionary
当向`SortedDictionary`中添加键值对时,它会自动根据键的顺序进行排序。可以使用`Add`方法来添加键值对,也可以使用索引器来访问和更新字典中的值。
以下是一个使用`SortedDictionary`的示例代码:
using System; using System.Collections.Generic; class Program { static void Main() { SortedDictionarydictionary = new SortedDictionary (); dictionary.Add(3, "Three"); dictionary.Add(1, "One"); dictionary.Add(2, "Two"); foreach (KeyValuePair kvp in dictionary) { Console.WriteLine("Key: {0}, Value: {1}", kvp.Key, kvp.Value); } } }
这个示例代码创建了一个`SortedDictionary`对象,并向其中添加了三个键值对。然后,使用`foreach`循环遍历字典中的键值对,并将它们输出到控制台。
运行这个代码,输出结果将按照键的顺序进行排序:
Key: 1, Value: One Key: 2, Value: Two Key: 3, Value: Three
使用`SortedDictionary`类可以很方便地对字典进行排序。这个解决方案可以帮助解决C#中对字典进行排序的问题。
C#: 如何对字典进行排序?
有时候我们需要对字典进行排序,以便按照键的顺序访问字典中的元素。虽然最简单的方法是使用SortedDictionary来实现字典的排序,但是如果我们希望保留字典的原始形式,也可以使用其他方法来实现。
一个解决方法是通过将字典的键存储在一个列表中,并对该列表进行排序,然后使用排序后的列表来访问字典。下面是一个示例代码:
Dictionarydupcheck = new Dictionary (); // 填充dupcheck字典 if (dupcheck.Count > 0) { Console.WriteLine("\ndupcheck (count: {0})\n----", dupcheck.Count); var keys_sorted = dupcheck.Keys.ToList(); keys_sorted.Sort(); foreach (var k in keys_sorted) { Console.WriteLine("{0} = {1}", k, dupcheck[k]); } }
需要注意的是,为了使用ToList()和Sort()方法,我们需要添加`using System.Linq;`命名空间。
除了上述方法外,还可以使用简化的排序方式。例如,可以使用`OrderBy()`方法对字典的键进行排序,并使用`ToList()`方法将排序后的结果存储在列表中。如果要同时使用字典的键和值,可以使用`OrderBy()`方法对键值对进行排序,然后使用`foreach`循环遍历排序后的结果并打印键和值。下面是示例代码:
foreach (var ent in dupcheck.OrderBy(kv => kv.Key)) Console.WriteLine($"{ent.Key} = {ent.Value}");
需要注意的是,这种方法只是对字典的展示进行排序,并不对字典本身进行排序。
总结起来,对字典进行排序的原因是为了按照键的顺序访问字典中的元素。解决方法包括使用SortedDictionary来实现字典的排序,或者通过将字典的键存储在一个列表中,并对该列表进行排序来实现对字典的访问。