HashSet<T> t = new HashSet<T>();
// add 10 million items
Dictionary<K, V> t = new Dictionary<K, V>();
// add 10 million items.
Quelle .Contains
méthode reviendra le plus rapidement?
Juste pour clarifier, mon exigence est que j'ai 10 millions d'objets (enfin, des chaînes vraiment) dont j'ai besoin pour vérifier s'ils existent dans la structure de données. Je ne réitérerai JAMAIS.
.net
performance
dictionary
hashset
Halivingston
la source
la source
Réponses:
Test de performance HashSet vs List vs Dictionary, tiré d' ici .
Ajouter 1000000 objets (sans vérifier les doublons)
Contient le chèque pour la moitié des objets d'une collection de 10000
Retirez la moitié des objets d'une collection de 10000
la source
Je suppose que vous voulez dire
Dictionary<TKey, TValue>
dans le deuxième cas?HashTable
est une classe non générique.Vous devez choisir la bonne collection pour le travail en fonction de vos besoins réels. Avez - vous réellement souhaitez mapper chaque touche à une valeur? Si tel est le cas, utilisez
Dictionary<,>
. Si vous ne vous en souciez que comme un ensemble, utilisezHashSet<>
.Je m'attendrais à ce que
HashSet<T>.Contains
etDictionary<TKey, TValue>.ContainsKey
(qui sont les opérations comparables, en supposant que vous utilisez votre dictionnaire raisonnablement) pour effectuer fondamentalement la même chose - ils utilisent le même algorithme, fondamentalement. Je suppose que les entréesDictionary<,>
étant plus vous vous retrouvez avec une plus grande probabilité de faire sauter le cache avecDictionary<,>
qu'avecHashSet<>
, mais je pense que d'être insignifiant par rapport à la douleur de choisir le mauvais type de données simplement en termes de ce que vous êtes essayer de réaliser.la source
Dictionary
pour d'autres raisons, vous devriez l'utiliser.À partir de la documentation MSDN pour Dictionary <TKey, TValue>
Avec une note:
Je sais que votre question / message est ancien - mais en cherchant une réponse à une question similaire, je suis tombé dessus.
J'espère que cela t'aides. Faites défiler jusqu'à la section Remarques pour plus de détails. https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx
la source
Ce sont des structures de données différentes. Il n'existe pas non plus de version générique de
HashTable
.HashSet
contient des valeurs de type T quiHashTable
(ouDictionary
) contiennent des paires clé-valeur. Vous devez donc choisir la collecte sur les données dont vous avez besoin pour stocker.la source
La réponse acceptée à cette question ne répond PAS valablement à la question! Il se trouve que cela donne la bonne réponse, mais cette réponse n'est pas montrée par les preuves qu'ils ont fournies.
Ce que cette réponse montre, c'est que les recherches clés sur un
Dictionary
ouHashSet
sont beaucoup plus rapides que la recherche dans un fichierList
. Ce qui est vrai, mais pas intéressant, ni surprenant, ni preuve qu'ils ont le même vitesse.J'ai exécuté le code ci-dessous pour comparer les temps de recherche, et ma conclusion est qu'ils SONT en fait la même vitesse. (Ou du moins, s'il y a une différence, alors la différence est bien dans l'écart type de cette vitesse)
Plus précisément, 100 000 000 de recherches prenaient entre 10 et 11,5 secondes pour les deux, pour moi, dans ce test.
Code de test:
la source