CodeGym /Cursos /C# SELF /Resumen de los principales tipos de colecciones

Resumen de los principales tipos de colecciones

C# SELF
Nivel 27 , Lección 0
Disponible

1. Introducción

Seamos sinceros, los arrays molan, pero tienen sus límites. ¿Necesitas cambiar el tamaño? ¡Toca crear un array nuevo y copiar los elementos a mano! ¿Quieres buscar rápido un elemento por clave? El array te dirá: "Bueno, inténtalo tú mismo".

La vida real está llena de situaciones donde los arrays son un rollo. Imagina que estás haciendo una app para llevar el control de libros en una biblioteca (¡hola, nuestro mini-sistema de aprendizaje!). Al principio tienes 5 libros — parece que un array basta. Una semana después ya hay 500, y al mes uno devuelve un libro y otro lo pierde... Aquí es donde entran en juego las colecciones.

Las colecciones son como contenedores que saben:

  • Cambiar su tamaño automáticamente.
  • Permitir búsquedas, añadidos y borrados rápidos.
  • Dar formas más cómodas de trabajar con los datos: ordenar, filtrar, procesar en grupo.

En .NET hay varias "familias" clave de colecciones. Hoy vamos a conocer las principales: listas (List<T>), diccionarios (Dictionary<TKey, TValue>), conjuntos (HashSet<T>), colas, pilas, y también las interfaces que hay detrás de ellas.

2. Tipos principales de colecciones

Aunque aún no hemos entrado en tipos concretos de colecciones genéricas, es importante entender qué categorías principales de colecciones existen y para qué sirven. Piensa en esto como diferentes tipos de "contenedores", cada uno con sus peculiaridades:

Listas (Lists)

¿Qué es? Una secuencia ordenada de elementos. Como una lista de la compra o la lista de alumnos en clase.

Características clave: Los elementos tienen un orden (puedes acceder por índice, como en un array). Puede haber elementos repetidos. El tamaño es dinámico.

¿Cuándo usarla? Cuando importa el orden de los elementos y quieres poder añadir/quitar elementos al final de la lista o acceder por posición.

Ejemplo de la vida real: Cola en la caja, lista de participantes en un webinar, secuencia de frames en una animación.

Diccionarios/Mapas (Dictionaries/Maps)

¿Qué es? Un conjunto de pares "clave-valor". Como un diccionario real, donde cada palabra (clave) tiene su significado (valor).

Características clave: Cada clave es única. La clave se usa para buscar rápido el valor correspondiente. El orden de los elementos normalmente no está garantizado.

¿Cuándo usarlo? Cuando necesitas encontrar rápido un valor por algún identificador único (clave).

Ejemplo de la vida real: Agenda de contactos (nombre - teléfono), base de datos de productos (ID - descripción), configuración de una app (nombre de la opción - valor).

Conjuntos (Sets)

¿Qué es? Un conjunto desordenado de elementos únicos. Como un conjunto matemático.

Características clave: No puede haber elementos repetidos. El orden no está garantizado. Están optimizados para comprobar si un elemento está y para operaciones de conjuntos (unión, intersección).

¿Cuándo usarlo? Cuando necesitas guardar valores únicos y comprobar rápido si un elemento está en el conjunto.

Ejemplo de la vida real: Lista de visitantes únicos de una web, conjunto de etiquetas de un artículo, lista de palabras para autocompletar (sin repes).

Colas (Queues)

¿Qué es? Colección que funciona con el principio "el primero que entra es el primero que sale" (FIFO - First-In, First-Out).

Características clave: Los elementos se añaden al final de la cola y se sacan del principio.

¿Cuándo usarla? Para modelar procesos donde el orden importa, como un sistema de tickets de soporte, cola de impresión.

Pilas (Stacks)

¿Qué es? Colección que funciona con el principio "el último que entra es el primero que sale" (LIFO - Last-In, First-Out).

Características clave: Los elementos se añaden y se sacan por el mismo extremo (la cima de la pila).

¿Cuándo usarla? Para seguir el historial de acciones (deshacer en un editor), manejar estructuras anidadas, recursión.

Diferencias entre tipos de colecciones

Tipo de colección Analogía Principio básico ¿Acceso por índice? ¿Orden de elementos? ¿Permite duplicados? Operaciones principales
Array Fila de casillas numeradas Tamaño fijo Obtener/poner por índice
Lista Lista de la compra Dinámico, ordenado Añadir, borrar, buscar
Diccionario Diccionario (clave-valor) Claves únicas No No (normalmente) No (por clave) Obtener por clave, añadir
Conjunto Conjunto de objetos únicos Sólo elementos únicos No No No Comprobar existencia, unión
Cola Cola en la caja FIFO (Primero entra - primero sale) No Añadir al final, sacar del principio
Pila Pila de platos LIFO (Último entra - primero sale) No Añadir arriba, sacar arriba

3. Lista: List<T>

La lista es la colección más usada en C#. Incluso más que el array. Una lista es una colección que se parece a un array, pero crece sola. Puedes añadir y quitar elementos sin comerte la cabeza.


using System;
using System.Collections.Generic;

var numbers = new List<int>();         // Creamos una lista vacía de enteros
numbers.Add(10);                      // Añadimos un elemento
numbers.Add(15);
numbers.Add(42);

Console.WriteLine(numbers[0]);        // 10

numbers.Remove(15);                   // Quitamos un elemento por valor

foreach (var number in numbers)
{
    Console.WriteLine(number);
}
// Mostrará: 10 y 42

¿Por qué List<T> es mejor que un array para colecciones de tamaño desconocido?
— Porque no tienes que reservar memoria ni copiar arrays a mano al añadir elementos — ¡la colección lo hace por ti!

¿Cuándo usar List<T>?

  • Lista dinámica, cuando puedes añadir, borrar o cambiar elementos.
  • No necesitas búsqueda rápida por clave (eso es cosa de diccionarios).
  • Muy usada para trabajar con conjuntos ordenados.

4. Diccionario Dictionary<TKey, TValue>

El array (y la lista) te deja guardar una lista de valores en casillas, y cada casilla tiene un índice. Pero el diccionario es una colección que te deja usar una cadena (nombre) en vez de un número (índice). Ese nombre de la casilla se llama clave.

Si necesitas encontrar rápido un valor por una clave (por ejemplo, por número de carnet de biblioteca — nombre del lector), necesitas un diccionario.


using System.Collections.Generic;

var phoneBook = new Dictionary<string, string>();
phoneBook["Anya"] = "+79992221133";
phoneBook["Maxim"] = "+79998887766";

Console.WriteLine(phoneBook["Anya"]);      // +79992221133

// Puedes comprobar si existe la clave:
if (phoneBook.ContainsKey("Vasya"))
{
    Console.WriteLine(phoneBook["Vasya"]);
}
else
{
    Console.WriteLine("¡No hay ese número!");
}

Dato curioso: A los diccionarios a veces se les llama "arrays asociativos". Se basan en una hash table, lo que permite buscar por clave muy rápido (casi instantáneo, salvo colisiones — pero eso lo veremos luego).

Características clave

  • La clave es única: no puede haber dos claves iguales en un diccionario.
  • Los valores pueden repetirse.
  • Busca, añade y borra elementos por clave muy rápido.

5. Conjunto: HashSet<T>

Además de listas y diccionarios, también son muy populares los conjuntos. Son casi como una lista, pero más simple: una lista sin orden fijo de elementos. Un conjunto simplemente guarda un grupo de valores, para cuando el orden no importa.

Por ejemplo, si sólo quieres saber si algo está en el grupo, sin duplicados y sin importar el orden — usa un conjunto.


using System.Collections.Generic;

var knownUsers = new HashSet<string>();
knownUsers.Add("admin");
knownUsers.Add("guest");
knownUsers.Add("admin");    // Añadir repetido — se ignora

Console.WriteLine(knownUsers.Contains("admin"));  // True
Console.WriteLine(knownUsers.Count);              // 2

El conjunto comprueba muy rápido si un elemento está.

¿Para qué sirven los conjuntos?
— Por ejemplo, para guardar todos los usuarios únicos que han abierto la app en un mes, o la lista de autores únicos de libros.

Características

  • Sólo guarda elementos únicos (si añades un duplicado, lo ignora).
  • No hay índices, como en la lista.
  • Comprobación rápida de existencia.

6. Colas y pilas

Hay estructuras para casos especiales: cola y pila. Son como listas, pero con reglas para añadir y sacar elementos.

Queue<T>: cola (first in — first out)

A veces necesitas una "cola" — el nuevo elemento va al final, y los sacas del principio.


using System.Collections.Generic;

var queue = new Queue<string>();
queue.Enqueue("Primero");
queue.Enqueue("Segundo");
queue.Enqueue("Tercero");

Console.WriteLine(queue.Dequeue()); // "Primero"
Console.WriteLine(queue.Peek());    // "Segundo", pero no lo quita

Stack<T>: pila (first in — last out)

La pila va al revés: el último que entra es el primero que sale. Se usa en parsers, llamadas de funciones y hasta para deshacer acciones en editores.


using System.Collections.Generic;

var stack = new Stack<string>();
stack.Push("Uno");
stack.Push("Dos");
stack.Push("Tres");

Console.WriteLine(stack.Pop());  // "Tres"
Console.WriteLine(stack.Peek()); // "Dos"

7. Tabla: comparación de colecciones principales

Colección Elementos únicos Acceso por índice Búsqueda rápida por clave Operaciones de inserción/borrado
List<T>
No No Rápido al final
Dictionary<K,V>
Claves No Rápido por clave
HashSet<T>
No Sí* Rápido por valor
Queue<T>
No No No Rápido (FIFO)
Stack<T>
No No No Rápido (LIFO)

Vamos a ver cada colección en detalle en las próximas lecciones. Y empezamos con la misteriosa letra <T>...

2
Tarea
C# SELF, nivel 27, lección 0
Bloqueada
Creación y llenado de una lista
Creación y llenado de una lista
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION