Quelle est la version générique d'une table de hachage?
J'ai appris les bases de génériques .NET. Cependant, je ne vois pas l'équivalent générique de Hashtable
. S'il vous plaît partager des exemples de code C# pour créer des génériques de table de hachage classes.
Vous devez vous connecter pour publier un commentaire.
Dictionnaire<TKey, TValue>
Noter 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 peut être une valeur de type, 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.
HashTable
peut en toute sécurité être accessibles que par un nombre arbitraire de threads de lecture alors qu'il est écrit (il n'est pas thread-safe pour plusieurs auteurs). En revanche,Dictionary<TKey,TValue>
n'est pas thread-safe pour n'importe quel scénario autre que de plusieurs lecteurs à zéro, les écrivains, même dans un add-seul scénario.ConcurrentDictionary<TKey, TValue>
, qui est thread-safe, comme d'autres collectionsSystem.Collections.Concurrent
.La version générique de la classe Hashtable est Système.Les Collections.Génériques.Dictionnaire classe.
Exemple de code:
La version générique d'une table de hachage est la
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)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 généraux
Encore mieux. Voici un tout version générique
Et qui est encore plus souple (merci Joel pour souligner que j'ai manqué ce)
Pour ceux qui sont intéressés, j'ai créé un générique de table de hachage classe wrapper, ce qui est utile pour l'application de sécurité de type et peut être passé comme un générique IDictionary, ICollection et IEnumerable type, tandis que la non-générique de table de hachage ne peut pas. Ci-dessous est la mise en œuvre.
J'ai fait quelques tests de cette table de hachage vs Dictionnaire et trouve les deux effectuer sur le même lorsqu'il est utilisé avec une clé de chaîne et de la chaîne de valeur de la paire, à l'exception de la table de hachage semble utiliser moins de mémoire. Les résultats de mon test sont comme suit:
La version générique de
System.Collection.Hashtable
estSystem.Les Collections.Génériques.Dictionnaire<TKey, TValue>
.Hashtable
etDictionary<int, int>
- je obtenir uneArgumentException
d'essayer d'ajouter la même clé (ou la valeur) deux fois parAdd
(et non l'exception dans les deux cas par l'indexeur). Comment voyez-vous les doublons interdites?ArgumentException
lors de l'ajout de la même clé viaAdd
, pas avec la même valeur. @wayne.blackmon êtes-vous en train de voir une différence entreHashtable
etDictionary
, ou avez-vous simplement besoin de les doublons, et de bon ni le projet de loi?