01
Qué es y qué problema resuelve
Una colección expresa un conjunto de elementos; el tipo genérico indica qué operaciones y valores acepta. List<Reserva> es modificable; IReadOnlyList<Reserva> limita la interfaz de acceso, aunque no garantiza inmutabilidad profunda de sus elementos.
Decide si entregas una instantánea o una vista de datos que aún pueden cambiar.
02
Ejemplo paso a paso
Punto de partida Fragmento de consola sin base de datos. El comparador ordinal hace explícita la comparación de identificadores.
Antes de ejecutar
Ejemplo de consola .NET 10. Integra el fragmento en Program.cs o en sus tipos auxiliares según corresponda; no mezcles declaraciones de tipos antes de instrucciones de nivel superior. No requiere una API ni una base.
var nombres = new[] { "sala-sur", "sala-norte", "sala-sur" };
var unicas = nombres.Distinct()
.OrderBy(nombre => nombre, StringComparer.Ordinal)
.ToArray();
Console.WriteLine(string.Join(", ", unicas));Cómo funciona
- Localiza la colección de entrada y el tipo de cada elemento.
- Sigue el filtro, la eliminación de duplicados y el orden en la secuencia escrita.
- Observa dónde se materializa el resultado y qué elementos quedan.
Resultado esperado: sala-norte, sala-sur: duplicados eliminados y orden estable.
03
Cuándo usarlo y qué debes evitar
LINQ separa filtro, orden y proyección. IEnumerable puede evaluar objetos; IQueryable puede representar una consulta traducible.
La ejecución diferida permite componer, pero enumerar dos veces puede repetir trabajo o observar cambios distintos. Materializa en el límite donde necesitas una instantánea y nunca cargues todas las filas antes de aplicar una restricción de acceso.
Ampliación opcional · contexto y variantes del tema
LINQ, ejecución diferida y cancelación
LINQ compone filtrado, ordenamiento y proyección. IEnumerable trabaja con objetos enumerables; IQueryable conserva una expresión que el proveedor puede traducir. Where no garantiza que ya se haya ejecutado una consulta. ToList materializa en memoria; ToListAsync materializa una consulta compatible de EF Core. Agrega un orden estable antes de paginar, porque sin orden el resultado puede cambiar entre consultas.
async permite suspender una operación mientras espera I/O. No convierte automáticamente un cálculo de CPU en trabajo paralelo. Transmite el CancellationToken hasta el adaptador y usa await; bloquear con .Result puede desperdiciar hilos y complicar el diagnóstico. Una cancelación posterior al commit no deshace la operación: diseña reintentos e idempotencia para ese escenario. Task.WhenAll requiere operaciones independientes; no ejecutes consultas concurrentes sobre el mismo DbContext.
Punto de partida reservas es IEnumerable<Reserva> y grupo es un identificador validado. La proyección reduce los datos entregados; filtrar por grupo aquí no reemplaza autorización.
Antes de ejecutar
Fragmento sobre tipos del laboratorio
var activas = reservas
.Where(r => r.GrupoId == grupo && !r.Cancelada)
.OrderBy(r => r.Id)
.Select(r => new { r.Id, r.SalaId })
.Take(20)
.ToList();Resultado esperado: Hasta 20 reservas activas del grupo, materializadas una vez.
04 · Práctica guiada · opcional
Practica lo aprendido
Ejecuta el catálogo de nombres. Agrega un duplicado y cambia el orden de entrada; explica cuándo se obtiene el array. Como ampliación, filtra, proyecta y limita una colección de reservas en memoria.
- 01Prepara un programa de consola con el fragmento y nombres duplicados.
- 02Ejecuta con dos órdenes de entrada y compara la salida.
- 03Relaciona cada operador con deduplicación, orden o materialización.
Ver solución orientativa
La salida es sala-norte, sala-sur en ambos órdenes. Distinct elimina duplicados, OrderBy fija el orden y ToArray recorre la secuencia. La consulta de reservas es una ampliación distinta.
05
Comprueba lo aprendido
Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.
01¿ToList convierte una consulta ilimitada en eficiente?
No. Materializa lo que hayas definido; limita y proyecta antes de ejecutar.
02¿Cuándo se calcula la lista y qué ocurriría si quitaras Distinct?
ToArray enumera y produce el resultado; Distinct y OrderBy componen la secuencia antes. Sin Distinct, sala-sur aparece dos veces aunque esté ordenada.
Cómo demostrar el objetivo
Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.
- Obtienes sala-norte y sala-sur una sola vez y en ese orden.
- Explicas qué operadores preparan la secuencia y qué operación la recorre.
Qué debes recordar
- LINQ expresa transformaciones sobre secuencias.
- Materializar una consulta determina cuándo se obtiene su resultado.
Tu cuaderno · notas personales
Cuaderno local
Tus notas del contenido
Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.
Material de apoyo · descarga, glosario y referencias
Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.