如何按字母顺序遍历Hashtable的键?

时间:2009-05-12 05:04:33

标签: c# key hashtable traversal

以递增的字母顺序遍历哈希表键的最简单方法是什么?

5 个答案:

答案 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并明确排序