以递增的字母顺序遍历哈希表键的最简单方法是什么?
答案 0 :(得分:12)
这完全取决于密钥的类型。但我们假设他们是一个字符串。您可以使用以下LINQ查询
Hashtable table = GetHashTable();
var keys = table.Keys.Cast<String>().OrderBy(x => x);
对于更复杂的结构,LINQ查询只是略有不同。让我们假设你有一个关键
的定义struct Name {
public string First;
public string Last;
// Equality code omitted
}
LINQ代码如下
Hashtable table = GetHashtable();
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last);
答案 1 :(得分:7)
好吧,我发现这个片段最适合我的情况:
Hashtable settings = GetSettings(); ArrayList keys = new ArrayList(); keys.AddRange(settings.Keys); keys.Sort(); foreach (object key in keys) { // Logic here }
答案 2 :(得分:2)
如果你想要一张能够保持按键自然顺序的地图,我建议你不要使用Hashtable
开头。如果您仍在使用1.1,请使用System.Collections.SortedList
。如果您使用的是2.0或更高版本,请使用SortedList<TKey, TValue>
或SortedDictionary<TKey, TValue>
。后两者在API方面基本相同,但具有不同的性能特征 - 请参阅文档以获取更多信息。
答案 3 :(得分:1)
这不是真正的哈希表的设计(它们是为了统一分配键)。使用排序树?
答案 4 :(得分:1)
使用SortedList可能会稍快一些 -
SortedList settings = new SortedList(GetSettings());
foreach (object key in settings.Keys)
{
//logic
}
创造&amp;排序ArrayList是O(n)+ O(nlog n)= O(nlog n),而SortedList构造函数(根据文档)是O(n),因此直接使用SortedList而不是使用它会更快一个arraylist并明确排序