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<string, int>
可以工作:
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<,>
的另一个优点是:它不使用数组,而 Dictionary<,>
使用。如果您有大量对象并且遇到大对象堆碎片问题,SortedDictionary<,>
是一种快速解决方案,可让您的数据远离大对象堆。【参考方案5】:
使用 Linq 很简单 (using System.Linq
):
var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();
返回KeyValuePair<string, int>
的列表。
【讨论】:
【参考方案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# 按键排序的哈希表的主要内容,如果未能解决你的问题,请参考以下文章