78 votes

Quelle est la version Générique d'une table de hachage?

J'ai appris les bases de génériques et il semble que cela peut vraiment améliorer les performances de l'application. Mais, je ne suis pas en mesure de voir le générique équivalent de la table de hachage. S'il vous plaît partager des exemples de code C# pour créer des génériques de table de hachage classes. J'en ai besoin pour une démo.

edit:Merci pour les réponses.

103voto

Joel Coehoorn Points 190579

Dictionary<TKey, TValue>

Notez que le Dictionnaire n'est pas une baisse de 100% dans le remplacement de la table de hachage.

Il y a une légère différence dans la façon de gérer la valeur Null. Le dictionnaire va lever une exception si vous essayez de faire référence à une clé qui n'existe pas. La table de hachage il suffit de retourner la valeur null. La raison en est que la valeur pourrait être un type de la valeur, qui ne peut pas être null. Dans une table de hachage la valeur a toujours été l'Objet, afin de retourner la valeur null est au moins possible.

42voto

Gulzar Nazim Points 35342

La version générique de la classe Hashtable est Système.Les Collections.Génériques.Dictionnaire de la classe.

Exemple de code:

Dictionary<int, string> numbers = new Dictionary<int, string>( );
   numbers.Add(1, "one");
   numbers.Add(2, "two");
   // Display all key/value pairs in the Dictionary.
   foreach (KeyValuePair<int, string> kvp in numbers)
   {
      Console.WriteLine("Key: " + kvp.Key + "\tValue: " + kvp.Value);
   }

22voto

JaredPar Points 333733

La version générique d'une table de hachage est l' Dictionary<TKey,TValue> classe (lien). Voici un exemple de code traduit de l'aide d'une table de hachage dans la plupart équivalent direct de Dictionnaire (vérification argument supprimée pour des raisons de concision)

public HashTable Create(int[] keys, string[] values) { 
  HashTable table = new HashTable();
  for ( int i = 0; i < keys.Length; i++ ) {
    table[keys[i]] = values[i];
  }
  return table;
}

public Dictionary<object,object> Create(int[] keys, string[] values) {
  Dictionary<object,object> map = Dictionary<object,object>();
  for ( int i = 0; i < keys.Length; i++) {
    map[keys[i]] = values[i];
  }
  return map;
}

C'est une manière assez directe de la traduction. Mais le problème, c'est que ce n'est pas réellement en profiter le type de fonctions de sécurité que des génériques. La deuxième fonction peut être écrite comme suit et être beaucoup plus de type sécurisé et inccur pas de la boxe frais généraux

public Dictionary<int,string> Create(int[] keys, string[] values) {
  Dictionary<int,string> map = Dictionary<int,string>();
  for ( int i = 0; i < keys.Length; i++) {
    map[keys[i]] = values[i];
  }
  return map;
}

Même mieux. Voici un tout version générique

public Dictionary<TKey,TValue> Create<TKey,TValue>(TKey[] keys, TValue[] values) {
  Dictionary<TKey,TValue> map = Dictionary<TKey,TValue>();
  for ( int i = 0; i < keys.Length; i++) {
    map[keys[i]] = values[i];
  }
  return map;
}

Et c'est encore plus flexible (merci Joel pour souligner que j'ai manqué ce)

public Dictionary<TKey,TValue> Create<TKey,TValue>(
    IEnumerable<TKey> keys, 
    IEnumerable<TValue> values) {

  Dictionary<TKey,TValue> map = Dictionary<TKey,TValue>();
  using ( IEnumerater<TKey> keyEnum = keys.GetEnumerator() ) 
  using ( IEnumerator<TValue> valueEnum = values.GetEnumerator()) {
    while (keyEnum.MoveNext() && valueEnum.MoveNext() ) { 
      map[keyEnum.Current] = valueEnum.Current;
    }
  }
  return map;
}

3voto

bdukes Points 54833

0voto

Joan Venge Points 34140

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X