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 se trouve sur la page HashSet MSDN .
- Où est-il utilisé?
- Pourquoi voudriez-vous l'utiliser?
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 se trouve sur la page HashSet MSDN .
Réponses:
A HashSet
contient un ensemble d'objets, mais d'une manière qui 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 code de hachage 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 comme il utilise une implémentation basée sur le hachage, ces opérations sont O (1). (Par opposition à List par exemple, qui est O (n) pour Contient et Remove.) HashSet
Fournit également des opérations d'ensemble standard telles que l' union , l' intersection et la différence symétrique . Jetez un oeil ici
Il existe différentes implémentations de Sets. Certains rendent les opérations d'insertion et de recherche super rapides en hachant les é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 prix de temps d'exécution plus lents.
La HashSet
classe en C # opte pour la première approche, ne préservant ainsi pas l'ordre des éléments. C'est beaucoup plus rapide qu'un habitué List
. Certains benchmarks de base ont montré que HashSet est décemment plus rapide lorsqu'il s'agit de 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.
Le seul hic, HashSet
c'est qu'il n'y a pas d'accès par les indices. Pour accéder aux éléments, vous pouvez soit utiliser un énumérateur, soit utiliser la fonction intégrée pour convertir le HashSet
en a List
et le parcourir. Jetez un oeil ici
A HashSet
possède une structure interne (hachage), où les éléments peuvent être recherchés et identifiés rapidement. L'inconvénient est que l'itération à travers un HashSet
(ou l'obtention d'un élément par index) est plutôt lente.
Alors, pourquoi voudrait-on savoir si une entrée existe déjà dans un ensemble?
Une situation où a HashSet
est utile consiste à obtenir des valeurs distinctes à partir d'une liste où des doublons peuvent exister. Une fois qu'un élément est ajouté à, HashSet
il est rapide de déterminer s'il existe ( Contains
opérateur).
D' autres avantages du HashSet
sont les opérations Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Si vous connaissez le langage de contrainte d'objet, vous identifierez ces opérations d'ensemble. Vous verrez également qu'il s'agit d'un pas de plus vers une implémentation d'UML exécutable.
En termes simples 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 en double et dont les éléments ne sont pas dans un ordre particulier. Ainsi, A HashSet<T>
est similaire à un générique List<T>
, mais est optimisé pour des recherches rapides (via des tables de hachage, comme son nom l'indique) au prix de la perte de commande.
Du point de vue de l'application, si l'on a seulement besoin d'éviter les doublons, HashSet
c'est ce que vous recherchez car sa complexité de recherche, d'insertion et de suppression est O (1) - constante . Cela signifie que peu importe le nombre d'éléments, HashSet
il faudra autant de temps pour vérifier s'il y a un tel élément ou non, et comme vous insérez également des éléments à O (1), cela le rend parfait pour ce genre de chose.