C#: 如何对一个字典进行排序?

28 浏览
0 Comments

C#: 如何对一个字典进行排序?

我在C#中有一个类似于Dictionary的字典,我想根据键(Person类中的字段)对该字典进行原地排序。我该如何做呢?互联网上提供的所有帮助都是关于列表的,没有特别示例说明如何对字典进行原地排序。非常感谢任何帮助!

0
0 Comments

在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。

0
0 Comments

在C#中,有一个问题是如何对字典进行排序。有人提出了一个解决方法,即使用`SortedDictionary`。

在stackoverflow论坛上,有人回答了这个问题,并给出了一个解决方案。他建议使用`SortedDictionary`来对字典进行排序。

这个解决方案是使用`SortedDictionary`类来创建一个有序的字典。`SortedDictionary`类是C#中的一个内置类,它可以对字典中的键进行排序。这个类可以使用泛型来指定键和值的类型。

要使用`SortedDictionary`类,需要引用命名空间`System.Collections.Generic`。然后,可以使用`SortedDictionary`来声明一个`SortedDictionary`对象,其中`TKey`是键的类型,`TValue`是值的类型。

当向`SortedDictionary`中添加键值对时,它会自动根据键的顺序进行排序。可以使用`Add`方法来添加键值对,也可以使用索引器来访问和更新字典中的值。

以下是一个使用`SortedDictionary`的示例代码:

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        SortedDictionary dictionary = 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#中对字典进行排序的问题。

0
0 Comments

C#: 如何对字典进行排序?

有时候我们需要对字典进行排序,以便按照键的顺序访问字典中的元素。虽然最简单的方法是使用SortedDictionary来实现字典的排序,但是如果我们希望保留字典的原始形式,也可以使用其他方法来实现。

一个解决方法是通过将字典的键存储在一个列表中,并对该列表进行排序,然后使用排序后的列表来访问字典。下面是一个示例代码:

Dictionary dupcheck = 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来实现字典的排序,或者通过将字典的键存储在一个列表中,并对该列表进行排序来实现对字典的访问。

0