HashSet La estructura de datos C # HashSet se introdujo en .NET Framework 3.5. Puede encontrar una lista completa de los miembros implementados en la página HashSet MSDN .
- Donde se usa
- ¿Por qué querrías usarlo?
HashSet La estructura de datos C # HashSet se introdujo en .NET Framework 3.5. Puede encontrar una lista completa de los miembros implementados en la página HashSet MSDN .
Respuestas:
A HashSet
contiene un conjunto de objetos, pero de una manera que le permite determinar fácil y rápidamente si un objeto ya está en el conjunto o no. Lo hace administrando internamente una matriz y almacenando el objeto utilizando un índice que se calcula a partir del código hash del objeto. Mira aquí
HashSet
es una colección desordenada que contiene elementos únicos. Tiene las operaciones de recopilación estándar Agregar, Eliminar, Contiene, pero dado que utiliza una implementación basada en hash, estas operaciones son O (1). (A diferencia de List, por ejemplo, que es O (n) para Contiene y Eliminar.) HashSet
También proporciona operaciones de conjuntos estándar como unión , intersección y diferencia simétrica . Mira aquí
Hay diferentes implementaciones de conjuntos. Algunos hacen que las operaciones de inserción y búsqueda sean súper rápidas mediante elementos hash. Sin embargo, eso significa que se pierde el orden en que se agregaron los elementos. Otras implementaciones preservan el orden agregado a costa de tiempos de ejecución más lentos.
La HashSet
clase en C # va para el primer enfoque, por lo tanto no conserva el orden de los elementos. Es mucho más rápido que un regular List
. Algunos puntos de referencia básicos mostraron que HashSet es decentemente más rápido cuando se trata de tipos primarios (int, double, bool, etc.). Es mucho más rápido cuando se trabaja con objetos de clase. Entonces ese punto es que HashSet es rápido.
El único inconveniente HashSet
es que no hay acceso por índices. Para acceder a los elementos, puede usar un enumerador o la función incorporada para convertirlo HashSet
en List
ay iterar a través de eso. Mira aquí
A HashSet
tiene una estructura interna (hash), donde los elementos se pueden buscar e identificar rápidamente. La desventaja es que iterar a través de HashSet
(u obtener un elemento por índice) es bastante lento.
Entonces, ¿por qué alguien querría saber si ya existe una entrada en un conjunto?
Una situación en la que a HashSet
es útil es obtener valores distintos de una lista donde pueden existir duplicados. Una vez que se agrega un elemento HashSet
, es rápido determinar si existe ( Contains
operador).
Otras ventajas de la HashSet
son las operaciones Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Si está familiarizado con el lenguaje de restricción de objetos , identificará estas operaciones de conjunto. También verá que está un paso más cerca de una implementación de UML ejecutable.
Simplemente dicho y sin revelar los secretos de la cocina:
un conjunto en general, es una colección que no contiene elementos duplicados, y cuyos elementos no están en ningún orden en particular. Entonces, A HashSet<T>
es similar a un genérico List<T>
, pero está optimizado para búsquedas rápidas (a través de tablas hash, como su nombre lo indica) a costa de perder el orden.
Desde la perspectiva de la aplicación, si uno solo necesita evitar duplicados, entonces HashSet
es lo que está buscando, ya que las complejidades de Buscar, Insertar y Eliminar son O (1): constante . Lo que esto significa es que no importa cuántos elementos HashSet
tenga, llevará la misma cantidad de tiempo verificar si existe ese elemento o no, además, dado que también está insertando elementos en O (1), lo hace perfecto para este tipo de cosas.