Question

Quelle est la façon de parcourir les clés d'un Hashtable plus facile par ordre alphabétique croissant?

Était-ce utile?

La solution

Cela dépend assez de ce que le type de la clé est. Mais laisse supposer une minute qu'ils sont des chaînes. Vous pouvez utiliser la requête suivante LINQ

Hashtable table = GetHashTable();
var keys = table.Keys.Cast<String>().OrderBy(x => x);

Pour les structures plus complexes de la requête LINQ est légèrement différente. Supposons aussi que vous aviez la définition suivante pour une touche

struct Name {
  public string First;
  public string Last;
  // Equality code omitted
}

Le code LINQ serait le suivant

Hashtable table = GetHashtable();
var keys = table.Keys.Cast<Name>().OrderBy(x => x.First).ThenBy(x => x.Last);

Autres conseils

Eh bien, je trouve cet extrait pour être le mieux adapté à ma situation:

Hashtable settings = GetSettings();
ArrayList keys = new ArrayList();
keys.AddRange(settings.Keys);
keys.Sort();
foreach (object key in keys)
{
    // Logic here
}

Si vous voulez une carte qui conserve ses clés dans l'ordre naturel, je vous suggère de ne pas utiliser pour commencer Hashtable. Si vous utilisez encore 1.1, en utilisant System.Collections.SortedList . Si vous utilisez 2.0 ou supérieur, utilisez ou SortedList<TKey, TValue> SortedDictionary<TKey, TValue>. Les deux derniers sont en grande partie même en termes d'API, mais ont des caractéristiques de performance - voir la documentation pour plus d'informations

.

Cest pas vraiment ce que les tables de hachage sont conçus pour (ils sont faits pour avoir une répartition uniforme des clés). Utilisez un arbre triés?

Ce sera probablement un peu plus rapide à utiliser SortedList -

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

créer et trier la liste de tableaux est O (n) + O (nlog n) = O (nlog n), alors que le constructeur SortedList (en accord avec la documentation) est O (n), alors il sera plus rapide à utiliser SortedList directement plutôt que d'utiliser un arraylist et explicitement le tri

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top