Как пройти ключи Hashtable в алфавитном порядке? - PullRequest
2 голосов
/ 12 мая 2009

Какой самый простой способ пройти ключи хеш-таблицы в возрастающем алфавитном порядке?

Ответы [ 5 ]

12 голосов
/ 12 мая 2009

Это в значительной степени зависит от типа ключа. Но давайте на минуту предположим, что они являются строками. Вы можете использовать следующий запрос 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);
7 голосов
/ 12 мая 2009

Что ж, я нашел этот фрагмент как наиболее подходящий для моей ситуации:

Hashtable settings = GetSettings();
ArrayList keys = new ArrayList();
keys.AddRange(settings.Keys);
keys.Sort();
foreach (object key in keys)
{
    // Logic here
}<br>
2 голосов
/ 12 мая 2009

Если вам нужна карта, которая хранит свои ключи в естественном порядке, я советую вам не использовать Hashtable для начала. Если вы все еще используете 1.1, используйте System.Collections.SortedList. Если вы используете 2.0 или выше, используйте SortedList<TKey, TValue> или SortedDictionary<TKey, TValue>. Последние два в значительной степени одинаковы с точки зрения API, но имеют разные характеристики производительности - для получения дополнительной информации см. Документацию.

1 голос
/ 12 мая 2009

Вероятно, будет немного быстрее использовать 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 напрямую, вместо использования arraylist и явной сортировки

1 голос
/ 12 мая 2009

Это не совсем то, для чего предназначены хеш-таблицы (они созданы для равномерного распределения ключей). Использовать отсортированное дерево?

...