HashSet La structure de données C # HashSet a été introduite dans le .NET Framework 3.5. Une liste complète des membres implémentés est disponible sur la page HashSet MSDN .
Un HashSet
contient un ensemble d'objets, mais vous permet de déterminer facilement et rapidement si un objet est déjà dans l'ensemble ou non. Pour ce faire, il gère en interne un tableau et stocke l'objet à l'aide d'un index calculé à partir du hashcode de l'objet. jetez un oeil ici
HashSet
est une collection non ordonnée contenant des éléments uniques. Il a les opérations de collecte standard Ajouter, Supprimer, Contient, mais puisqu'il utilise une implémentation basée sur un hachage, ces opérations sont O (1). (Contrairement à List par exemple, qui est O(n) pour Contains et Remove.) HashSet
fournit également des opérations standard telles que union , intersection et différence symétrique . regardez ici
Il existe différentes implémentations des ensembles. Certains accélèrent les opérations d'insertion et de recherche en hachant des éléments. Cependant, cela signifie que l'ordre dans lequel les éléments ont été ajoutés est perdu. D'autres implémentations préservent l'ordre ajouté au détriment des temps d'exécution plus lents.
La classe HashSet
en C # va pour la première approche, donc pas en préservant l'ordre des éléments. C'est beaucoup plus rapide qu'un List
normal. Certains tests de base ont montré que HashSet est nettement plus rapide s’agissant des types primaires (int, double, bool, etc.). C'est beaucoup plus rapide lorsque vous travaillez avec des objets de classe. Donc, ce point est que HashSet est rapide.
La seule prise de HashSet
est qu'il n'y a pas d'accès par index. Pour accéder aux éléments, vous pouvez utiliser un énumérateur ou la fonction intégrée pour convertir le HashSet
en un List
et le parcourir . Jetez un coup d’œil ici
Un HashSet
possède une structure interne (hachage) dans laquelle les éléments peuvent être recherchés et identifiés rapidement. L'inconvénient est que l'itération à travers une HashSet
(ou l'obtention d'un élément par index) est plutôt lente.
Alors, pourquoi quelqu'un voudrait-il pouvoir savoir s'il existe déjà une entrée dans un ensemble?
Une situation où une HashSet
est utile consiste à obtenir des valeurs distinctes d'une liste où des doublons peuvent exister. Une fois qu'un élément est ajouté à la variable HashSet
, il est rapide de déterminer s'il existe (opérateur Contains
).
Les autres avantages de la HashSet
sont les opérations Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Si vous connaissez le langage de contrainte d'objet , alors vous identifierez ces opérations définies. Vous verrez également que c'est un pas de plus vers une implémentation de l'exécutable UML.
Simplement dit et sans révéler les secrets de la cuisine: un ensemble en général, est une collection qui ne contient aucun élément dupliqué et dont les éléments ne sont dans aucun ordre particulier. Ainsi, un HashSet<T>
est similaire à un List<T>
générique, mais il est optimisé pour les recherches rapides (via des hashtables, comme son nom l'indique) au prix d'une perte d'ordre.
Du point de vue de l’application, s’il suffit d’éviter les doublons, alors HashSet
est ce que vous recherchez car il s’agit de Lookup, Insert and Remove les complexités sont O(1) - constant =. Cela signifie que peu importe le nombre d'éléments HashSet
, il faudra autant de temps pour vérifier si un tel élément existe ou non, en plus du fait que vous insérez des éléments à O(1) aussi cela le rend parfait pour ce genre de chose.