HashSet vs List en C#
Este tutorial discutirá las diferencias y similitudes entre un HashSet<T>
y una List<T>
en C#.
HashSet<T>
en C#
La definición matemática de un conjunto es una colección desordenada de objetos distintos. La estructura de datos HashSet
en C# también sigue el mismo principio.
Un HashSet
es una colección de objetos que no se repiten y que no siguen ninguna secuencia específica. Un HashSet
generalmente se usa cuando no queremos valores duplicados en nuestros datos.
Es una colección genérica incluida en el espacio de nombres System.Collection.Generic
.
Una ventaja de HashSet
es que podemos aplicar todas las operaciones de conjuntos como unión, intersección y diferencia de conjuntos. Una desventaja notable de usar un HashSet
es que no podemos ordenarlo porque no sigue ninguna secuencia específica.
El siguiente fragmento de código nos muestra cómo podemos trabajar con conjuntos hash en C#.
HashSet<int> weirdNumbers = new HashSet<int>();
weirdNumbers.Add(10);
weirdNumbers.Add(13);
weirdNumbers.Add(17);
weirdNumbers.Add(78);
weirdNumbers.Add(13);
Console.WriteLine("HashSet before removal");
foreach (int val in weirdNumbers) {
Console.WriteLine(val);
}
weirdNumbers.Remove(13);
Console.WriteLine("HashSet after removal");
foreach (int val in weirdNumbers) {
Console.WriteLine(val);
}
Producción :
HashSet before removal
10
13
17
78
HashSet after removal
10
17
78
Mostramos cómo podíamos crear un conjunto de hash genérico, insertar valores en él, eliminarlos del conjunto de hash e imprimirlos dentro del conjunto de hash en el ejemplo de código anterior.
La función Add()
dentro de la clase HashSet<T>
se usa para insertar un solo valor en el conjunto hash. Junto con la función Add()
, se proporcionan muchas otras funciones útiles dentro de la clase HashSet<T>
.
La función Remove(T val)
elimina val
de nuestro conjunto hash. Toma el valor como parámetro de entrada y lo elimina de nuestro conjunto hash.
List<T>
en C#
En C#, una lista es una colección de objetos fuertemente tipados. Se puede acceder a los elementos de una lista a través de un índice.
Un objeto de lista contiene muchos métodos útiles para ordenar, buscar y modificar una lista. Se incluye en el espacio de nombres System.Collection.Generic
.
Otra ventaja de las listas es que proporcionan verificación de tipo en tiempo de compilación y no realizan el encuadre/desencuadre porque son genéricas. Una lista de tipo de datos T
se puede inicializar con List<T>
.
Los siguientes fragmentos de código demuestran cómo podemos trabajar con listas en C#.
List<int> weirdNumbers = new List<int>();
weirdNumbers.Add(10);
weirdNumbers.Add(17);
weirdNumbers.Add(78);
weirdNumbers.Add(13);
foreach (int val in weirdNumbers) {
Console.WriteLine(val);
}
Producción :
10
17
78
13
En el código anterior, inicializamos la lista de enteros weirdNumbers
en la primera línea, insertamos valores en la lista con la función Add()
y usamos un bucle foreach
para imprimir todos los valores dentro de la lista.
La función Add()
dentro de la clase List<T>
se utiliza para insertar valores en la lista. Junto con la función Add()
, se proporcionan muchas otras funciones útiles dentro de la clase List<T>
.
La función AddRange()
puede insertar otro array o lista en una lista existente. Toma la lista o array como parámetros de entrada y agrega los elementos de la lista o array al final de la lista principal.
También podemos usar la función Insert()
para insertar un solo valor en un índice específico en la lista. La función Insert()
toma como parámetros de entrada el índice entero y el valor de tipo T
.
Hemos hablado mucho sobre agregar nuevos elementos a una lista. Analicemos cómo podemos eliminar elementos existentes de una lista.
La función Remove(T val)
elimina la primera aparición del val
dentro de nuestra lista. Toma el valor como parámetro de entrada y elimina la primera aparición de ese valor dentro de nuestra lista a partir del índice 0.
La función RemoveAt(int index)
elimina el valor en un índice específico dentro de nuestra lista. Toma el índice como parámetro de entrada y elimina cualquier valor que se coloque.
El siguiente fragmento de código pone todas las funciones que discutimos en un pequeño bloque ordenado.
List<int> weirdNumbers = new List<int>();
weirdNumbers.Add(10);
weirdNumbers.Add(17);
weirdNumbers.Add(78);
weirdNumbers.Add(13);
weirdNumbers.Insert(3, 31);
Console.WriteLine("List before removal");
foreach (int val in weirdNumbers) {
Console.WriteLine(val);
}
weirdNumbers.Remove(31);
weirdNumbers.RemoveAt(1);
Console.WriteLine("List after removal");
foreach (int val in weirdNumbers) {
Console.WriteLine(val);
}
Producción :
List before removal
10
17
78
31
13
List after removal
10
78
13
Mostramos cómo podíamos crear una lista genérica, insertar valores en ella, eliminar valores de la lista e imprimir los valores dentro de la lista en el ejemplo de código anterior.
HashSet<T>
frente a List<T>
en C#
Tanto las listas como los conjuntos hash tienen sus ventajas y desventajas entre sí. Si bien los conjuntos hash son mucho más rápidos que las listas para grandes cantidades de datos, las listas brindan capacidades de indexación.
Si bien podemos ordenar listas, los conjuntos hash brindan la capacidad de realizar operaciones de conjuntos.
En resumen, listas o conjuntos hash, la elección depende completamente de nuestro problema.
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
LinkedIn