2

按字母升序遍历哈希表键的最简单方法是什么?

4

5 回答 5

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);
于 2009-05-12T05:06:59.890 回答
7

好吧,我发现这个片段最适合我的情况:

哈希表设置 = GetSettings();
ArrayList 键 = 新 ArrayList();
键.AddRange(settings.Keys);
键.排序();
foreach(键中的对象键)
{
    // 这里的逻辑
}

于 2009-05-12T07:44:09.600 回答
2

如果您想要一张保持其键自然顺序的地图,我建议您不要使用Hashtable开始。如果您仍在使用 1.1,请使用System.Collections.SortedList. 如果您使用的是 2.0 或更高版本,请使用SortedList<TKey, TValue>SortedDictionary<TKey, TValue>。后两者在 API 方面基本相同,但具有不同的性能特征 - 有关更多信息,请参阅文档。

于 2009-05-12T05:16:55.647 回答
1

这并不是哈希表的真正设计目的(它们被设计成具有统一的键分布)。使用排序树?

于 2009-05-12T05:07:07.190 回答
1

使用 SortedList 可能会稍微快一些 -

SortedList settings = new SortedList(GetSettings());
foreach (object key in settings.Keys)
{
    //logic
}

创建和排序ArrayList是O(n)+ O(nlog n)= O(nlog n),而SortedList构造函数(根据文档)是O(n),所以直接使用SortedList会更快比使用数组列表和显式排序

于 2009-05-12T11:48:33.837 回答