Fundamentos de LINQ en C# (Where, Select, OrderBy)
Aprende fundamentos de LINQ en C# con Where, Select y OrderBy para consultar, filtrar y ordenar colecciones con ejemplos.
En C#, LINQ (Language Integrated Query) es una característica poderosa que facilita las consultas sobre colecciones y fuentes de datos.
Con LINQ, puedes escribir expresiones similares a SQL en arreglos, listas, XML o bases de datos.
En este artículo veremos los operadores básicos de LINQ: Where, Select y OrderBy.
Where
El método Where se utiliza para filtrar elementos que cumplen una condición determinada.
Recibe un predicado (una función que devuelve bool).
using System;
using System.Linq;
using System.Collections.Generic;
var numeros = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Seleccionar los números pares
var pares = numeros.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(", ", pares));
// Salida: 2, 4, 6, 8, 10
Ejecución diferida (Deferred Execution): Cuando escribes
var result = books.Where(...), la consulta no se ejecuta inmediatamente.
LINQ solo crea una definición de consulta. El filtrado ocurre cuando el resultado
se enumera (por ejemplo con foreach) o cuando se llaman métodos como
ToList(), ToArray() o Count().
Ejemplo de ejecución diferida
var numeros = new List<int>
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
var pares = numeros.Where(n => n % 2 == 0);
// Modificar la colección después de definir la consulta
numeros.Add(11);
numeros.Add(12);
numeros.Add(13);
numeros.Add(14);
// La consulta se ejecuta aquí
Console.WriteLine(string.Join(", ", pares));
// Resultado: 2, 4, 6, 8, 10, 12, 14
Observa que 12 y 14 se incluyen en el resultado,
aunque fueron agregados después de la instrucción Where.
Esto ocurre porque Where utiliza ejecución diferida
y evalúa la colección en el momento de la enumeración.
Select
El operador Select se utiliza para transformar (proyectar) cada elemento de una colección.
Por ejemplo, generar cuadrados de números o seleccionar solo ciertas propiedades de los objetos.
// Cuadrados de los números
var cuadrados = numeros.Select(n => n * n);
Console.WriteLine(string.Join(", ", cuadrados));
// Salida: 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
// Ejemplo con objetos
var estudiantes = new List<(int Id, string Nombre)>
{
(1, "Juan"),
(2, "María"),
(3, "Miguel")
};
// Seleccionar solo los nombres
var nombres = estudiantes.Select(e => e.Nombre);
Console.WriteLine(string.Join(", ", nombres));
// Salida: Juan, María, Miguel
OrderBy
El método OrderBy ordena los elementos según una clave especificada.
Por defecto, ordena de forma ascendente. Para ordenar de forma descendente, se usa OrderByDescending.
var frutas = new List<string> { "Manzana", "Pera", "Banana", "Kiwi" };
// Ordenar alfabéticamente
var ordenadas = frutas.OrderBy(f => f);
Console.WriteLine(string.Join(", ", ordenadas));
// Salida: Banana, Kiwi, Manzana, Pera
// Ordenar por longitud en forma descendente
var porLongitud = frutas.OrderByDescending(f => f.Length);
Console.WriteLine(string.Join(", ", porLongitud));
// Salida: Manzana, Banana, Pera, Kiwi
Usar Where + Select + OrderBy juntos
Los operadores LINQ se suelen encadenar. En el siguiente ejemplo: primero se filtra, luego se transforma y finalmente se ordena.
var numeros2 = new List<int> { 10, 3, 7, 8, 2, 15, 6 };
// Obtener los cuadrados de los números mayores que 5, ordenados ascendentemente
var resultado = numeros2
.Where(n => n > 5)
.Select(n => n * n)
.OrderBy(n => n);
Console.WriteLine(string.Join(", ", resultado));
// Salida: 36, 49, 64, 100, 225
Aplicación de ejemplo: Lista de libros
En este escenario consultamos una lista de libros con LINQ:
filtrar los libros con más de 200 páginas (Where),
seleccionar solo los títulos (Select),
y ordenarlos por la longitud del título (OrderBy).
public class Libro
{
public string Titulo { get; set; } = string.Empty;
public int Paginas { get; set; }
}
class Program
{
static void Main()
{
var libros = new List<Libro>
{
new Libro { Titulo = "Programación en C#", Paginas = 350 },
new Libro { Titulo = "Guía LINQ", Paginas = 220 },
new Libro { Titulo = "Cuentos cortos", Paginas = 120 },
new Libro { Titulo = "Algoritmos", Paginas = 400 }
};
var result = libros
.Where(l => l.Paginas > 200)
.Select(l => l.Titulo)
.OrderBy(t => t.Length);
Console.WriteLine("Libros seleccionados:");
foreach (var titulo in result)
Console.WriteLine(titulo);
}
}
// Salida:
// Libros seleccionados:
// Guía LINQ
// Programación en C#
// Algoritmos
Resumen (TL;DR)
Where: Filtra elementos.Select: Transforma (proyecta) elementos.OrderBy: Ordena elementos (ascendente/descendente).- Los operadores pueden encadenarse:
Where → Select → OrderBy. - LINQ facilita la escritura de consultas potentes, similares a SQL, sobre colecciones.