LINQ: Where, Select, OrderBy
LINQ (Language Integrated Query) es una de las características más distinguidas de C#: permite consultar datos con la misma sintaxis sin importar si están en una lista en memoria, una base de datos SQL, un archivo XML, o un servicio web. Fue introducido en C# 3.0 (2007) y literalmente cambió cómo se escribe C#.
La idea: en lugar de un loop for con condicionales y acumuladores, describes qué quieres y LINQ se encarga del cómo.
Operaciones principales de LINQ: • Where(f) → filtra: deja solo los elementos que cumplen la condición f • Select(f) → transforma cada elemento (como map en JavaScript) • OrderBy(f) → ordena según el valor que devuelve f
LINQ usa ejecución diferida: Where, Select y OrderBy no procesan nada al escribirlos, solo preparan una "receta". La consulta se ejecuta cuando llamas a una operación que da un resultado final.
Operaciones que ejecutan la consulta: • ToList() / ToArray() → guarda el resultado en una lista o un array • Count() → cuántos elementos hay. new[] { 1, 2, 3 }.Count() da 3 • First() → el primero (lanza un error si no hay ninguno) • Sum() → la suma. new[] { 1, 2, 3 }.Sum() da 6 Así, .Where(x => condicion).First() se detiene en cuanto encuentra el primero que cumple, sin recorrer el resto.
using System.Linq;
var numeros = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Where - filtrar
var pares = numeros.Where(n => n % 2 == 0).ToList();
// { 2, 4, 6, 8, 10 }
// Select - transformar (como map)
var cuadrados = numeros.Select(n => n * n).ToList();
// { 1, 4, 9, 16, 25, ... }
// Select con objeto anónimo
var personas = new[] {
new { Nombre = "Ana", Edad = 25 },
new { Nombre = "Bob", Edad = 30 },
new { Nombre = "Carlos", Edad = 20 }
};
var nombres = personas.Select(p => p.Nombre).ToList();
var mayores = personas.Where(p => p.Edad >= 25).ToList();
// OrderBy / OrderByDescending
var ordenados = personas.OrderBy(p => p.Nombre).ToList();
var desc = personas.OrderByDescending(p => p.Edad).ToList();
var multi = personas.OrderBy(p => p.Edad).ThenBy(p => p.Nombre);
// Operaciones de agregación
int suma = numeros.Sum(); // 55
double promedio = numeros.Average(); // 5.5
int max = numeros.Max(); // 10
int min = numeros.Min(); // 1
int cantidad = numeros.Count(); // 10
int contarPares = numeros.Count(n => n % 2 == 0); // 5
// First / Last / Single
int primero = numeros.First(); // 1
int ultimo = numeros.Last(); // 10
int primerPar = numeros.First(n => n % 2 == 0); // 2
int? primeroPorDefecto = numeros.FirstOrDefault(n => n > 100); // null
// Any / All
bool hayPares = numeros.Any(n => n % 2 == 0); // true
bool todosPares = numeros.All(n => n % 2 == 0); // false
Practica esta lección
Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.
Empezar a practicar