c# 按键排序的哈希表

Posted

技术标签:

【中文标题】c# 按键排序的哈希表【英文标题】:c# Hashtable sorted by Keys 【发布时间】:2012-03-06 00:11:23 【问题描述】:

我有一个带有字母键和数字值的哈希表。 如何根据键对哈希表进行排序?

ExchangeA, 200
ExchangeV, 100
ExchangeC, 200

变成这样

ExchangeA, 200
ExchangeC, 200
ExchangeV, 100

【问题讨论】:

哈希表是一种固有的无序数据结构。你想做什么?可以创建键/值对的排序列表,这会做你想要的吗? 几个答案建议使用 linq 的 Enumerable.OrderBy 扩展方法。值得一提的是,哈希表和字典可以有自定义相等比较器;如果您依赖此功能,您可能希望使用接受自定义 IComparer 实例的 OrderBy 重载,以提供与您用于编译哈希表或字典的相等关系兼容的排序。 我会说你想使用 SortedList 或 SortedDictionary 【参考方案1】:

我使用一个列表来存储 Hashtable 的键并对其进行排序,然后使用该排序列表显示 Hashtable。这是我的代码:

        List<string> lst = new List<string>();
        foreach (var key2 in ht.Keys)
        
            lst.Add(key2.ToString());
        
        lst.Sort();
        foreach (var item in lst)
        
            Console.WriteLine(string.Format("0,1", item, ht[item.ToString()]));
        

【讨论】:

【参考方案2】:

我发现“排序”哈希表的最简单方法是:

var hash = new Hashtable();
var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys
var allKvp = from x in orderedKeys select new key = x, value = hash[x] ;

但是,我没有对原始哈希表进行排序,只是以有序的方式读取其值。

和其他回复一样,如果你需要以排序方式存储你的数据,最好是使用SortedDictionary

【讨论】:

【参考方案3】:

使用列表而不是散列(或将散列转换为字典),然后执行以下操作:

var dictionary = new Dictionary<string, int>();
var l = dictionary.Keys.ToList();
l.Sort();
foreach (var key in l)

    Console.WriteLine(dictionary[key]);

【讨论】:

【参考方案4】:

您可以为此使用SortedDictionary,它将为您按键排序。在您的情况下,SortedDictionary&lt;string, int&gt; 可以工作:

SortedDictionary<string, int> dict = new SortedDictionary<string, int>();
dict.Add("Exchange C", 200);
dict.Add("Exchange A", 200);
dict.Add("Exchange V", 100);

foreach (var kvp in dict)

    Console.WriteLine("Key = 0, Value = 1", kvp.Key, kvp.Value);

输出:

Key = Exchange A, Value = 200
Key = Exchange C, Value = 200
Key = Exchange V, Value = 100

【讨论】:

值得注意的是,SortedDictionary 是在内部通过二叉搜索树实现的,具有O(lg n) 检索而不是预期的O(1) 检索哈希表。根据 OP 的需求,他可能想要这个,或者他可能想要像其他答案一样执行 OrderBy 是的 - 这是一个很好的观点 - 使用SortedDictionary 仅在必须经常/总是按顺序检索并且密钥查找时间不重要时才值得使用(@987654330 @ 仍然很棒,但肯定比 O(1)) 更糟 @GabeMoothart SortedDictionary&lt;,&gt; 的另一个优点是:它不使用数组,而 Dictionary&lt;,&gt; 使用。如果您有大量对象并且遇到大对象堆碎片问题,SortedDictionary&lt;,&gt; 是一种快速解决方案,可让您的数据远离大对象堆。【参考方案5】:

使用 Linq 很简单 (using System.Linq):

var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();

返回KeyValuePair&lt;string, int&gt;的列表。

【讨论】:

【参考方案6】:

由于哈希表的性质,您无法根据键对它们进行排序:它们根据哈希码将键组织在存储桶中,哈希码是哈希表无法控制的值。但是,您可以按照您喜欢的任何顺序读取键值对。以下是使用 LINQ 的方法:

IDictionary<string, int> d = ...; // your hash table
var ordered = d.OrderBy(p => p.Key).ToList();
foreach (var p in ordered) 
    Console.WriteLine("Key: 0 Value: 1", p.Key, p.Value);

【讨论】:

以上是关于c# 按键排序的哈希表的主要内容,如果未能解决你的问题,请参考以下文章

c#哈希表 怎么对value(double类型)进行排序 按顺序输出key(string类型)

C# 通俗说 哈希表

Powershell 排序哈希表

大小写无关排序

哈希表 - 按输入方式排序

按键排序哈希,在 Ruby 中返回哈希