CSharp
Tutorial CSharp: LINQ básico
Aprende LINQ básico en C# para realizar consultas declarativas sobre colecciones y simplificar el manejo de datos con ejemplos prácticos.
Aprende CSharp y certifícateLINQ básico
LINQ (Language Integrated Query) es una característica de C# que permite realizar consultas sobre colecciones de datos de forma declarativa, similar a SQL. Esta funcionalidad integrada en el lenguaje nos permite escribir consultas de manera más legible y expresiva, reduciendo la cantidad de código necesario para manipular datos.
La sintaxis de consulta de LINQ se asemeja a SQL, lo que facilita su aprendizaje si ya estás familiarizado con bases de datos. Con LINQ podemos filtrar, ordenar, agrupar y transformar datos de diferentes fuentes como arrays, listas, diccionarios y otras colecciones.
Sintaxis básica de LINQ
La sintaxis de consulta LINQ sigue un patrón que comienza con la palabra clave from
y termina generalmente con una cláusula select
. Esta estructura puede parecer invertida respecto a SQL, pero tiene sentido cuando consideramos que necesitamos especificar primero la fuente de datos.
La estructura básica es:
var consulta = from elemento in coleccion
where condicion
orderby propiedad
select resultado;
Veamos un ejemplo sencillo:
// Definimos una colección de números
int[] numeros = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// Consulta LINQ para obtener números pares
var numerosPares = from num in numeros
where num % 2 == 0
select num;
// Recorremos los resultados
foreach (var numero in numerosPares)
{
Console.WriteLine(numero);
}
Este código muestra todos los números pares de la colección. La consulta se lee casi como una frase: "de los números, donde el número módulo 2 es igual a cero, selecciona el número".
Operadores básicos de LINQ
LINQ proporciona varios operadores que nos permiten manipular colecciones de datos. Veamos los más comunes:
Filtrado con where
El operador where
nos permite filtrar elementos basados en una condición:
string[] nombres = { "Ana", "Juan", "Pedro", "María", "José" };
var nombresCortos = from nombre in nombres
where nombre.Length <= 4
select nombre;
// Resultado: Ana, Juan, José
Proyección con select
El operador select
nos permite transformar los elementos de la colección:
string[] frutas = { "manzana", "pera", "plátano", "naranja" };
var longitudNombres = from fruta in frutas
select fruta.Length;
// Resultado: 7, 4, 7, 7 (longitud de cada nombre)
También podemos crear objetos anónimos:
var detallesFrutas = from fruta in frutas
select new {
Nombre = fruta,
Longitud = fruta.Length
};
foreach (var detalle in detallesFrutas)
{
Console.WriteLine($"{detalle.Nombre}: {detalle.Longitud} letras");
}
Ordenamiento con orderby
El operador orderby
nos permite ordenar los resultados:
var frutasOrdenadas = from fruta in frutas
orderby fruta
select fruta;
// Resultado: manzana, naranja, pera, plátano (orden alfabético)
Para ordenar de forma descendente:
var frutasOrdenDesc = from fruta in frutas
orderby fruta descending
select fruta;
// Resultado: plátano, pera, naranja, manzana
Trabajando con colecciones de objetos
LINQ es especialmente útil cuando trabajamos con colecciones de objetos. Veamos un ejemplo:
// Definimos una clase Producto
public class Producto
{
public int Id { get; set; }
public string Nombre { get; set; }
public decimal Precio { get; set; }
public string Categoria { get; set; }
}
// Creamos una lista de productos
List<Producto> productos = new List<Producto>
{
new Producto { Id = 1, Nombre = "Laptop", Precio = 1200, Categoria = "Electrónica" },
new Producto { Id = 2, Nombre = "Teléfono", Precio = 800, Categoria = "Electrónica" },
new Producto { Id = 3, Nombre = "Mesa", Precio = 350, Categoria = "Muebles" },
new Producto { Id = 4, Nombre = "Silla", Precio = 120, Categoria = "Muebles" },
new Producto { Id = 5, Nombre = "Auriculares", Precio = 80, Categoria = "Electrónica" }
};
// Consulta para obtener productos de electrónica ordenados por precio
var electronicos = from p in productos
where p.Categoria == "Electrónica"
orderby p.Precio descending
select p;
foreach (var producto in electronicos)
{
Console.WriteLine($"{producto.Nombre} - ${producto.Precio}");
}
Operadores de agrupación
LINQ también nos permite agrupar datos utilizando el operador group by
:
var productosPorCategoria = from p in productos
group p by p.Categoria into grupoCat
select new {
Categoria = grupoCat.Key,
Productos = grupoCat
};
foreach (var grupo in productosPorCategoria)
{
Console.WriteLine($"Categoría: {grupo.Categoria}");
foreach (var producto in grupo.Productos)
{
Console.WriteLine($" - {producto.Nombre}: ${producto.Precio}");
}
}
Operadores de agregación
LINQ proporciona varios métodos de agregación como Count()
, Sum()
, Average()
, Min()
y Max()
:
// Contar productos de electrónica
var cantidadElectronicos = (from p in productos
where p.Categoria == "Electrónica"
select p).Count();
// Precio promedio de los muebles
var precioPromedioMuebles = (from p in productos
where p.Categoria == "Muebles"
select p.Precio).Average();
Console.WriteLine($"Cantidad de productos electrónicos: {cantidadElectronicos}");
Console.WriteLine($"Precio promedio de muebles: ${precioPromedioMuebles}");
Combinando operadores
Podemos combinar varios operadores LINQ para crear consultas más complejas:
var resumen = from p in productos
group p by p.Categoria into grupoCat
select new {
Categoria = grupoCat.Key,
CantidadProductos = grupoCat.Count(),
PrecioPromedio = grupoCat.Average(p => p.Precio),
PrecioTotal = grupoCat.Sum(p => p.Precio)
};
foreach (var item in resumen)
{
Console.WriteLine($"Categoría: {item.Categoria}");
Console.WriteLine($" Cantidad: {item.CantidadProductos}");
Console.WriteLine($" Precio promedio: ${item.PrecioPromedio}");
Console.WriteLine($" Valor total: ${item.PrecioTotal}");
}
Ejecución diferida
Un aspecto importante de LINQ es que las consultas tienen ejecución diferida. Esto significa que la consulta no se ejecuta cuando se define, sino cuando se itera sobre los resultados:
// Definimos la consulta
var consulta = from p in productos
where p.Precio > 100
select p;
// Añadimos un nuevo producto a la lista
productos.Add(new Producto { Id = 6, Nombre = "Monitor", Precio = 250, Categoria = "Electrónica" });
// Al iterar sobre la consulta, incluirá el nuevo producto
foreach (var producto in consulta)
{
Console.WriteLine(producto.Nombre);
}
Si necesitamos ejecutar la consulta inmediatamente y almacenar los resultados, podemos usar métodos como ToList()
o ToArray()
:
// Ejecución inmediata y almacenamiento de resultados
var resultados = (from p in productos
where p.Precio > 100
select p).ToList();
// Añadir un nuevo producto no afectará a 'resultados'
productos.Add(new Producto { Id = 7, Nombre = "Teclado", Precio = 50, Categoria = "Electrónica" });
LINQ es una herramienta fundamental en C# que simplifica enormemente el trabajo con colecciones de datos, permitiéndonos escribir código más limpio, legible y mantenible.
Otras lecciones de CSharp
Accede a todas las lecciones de CSharp y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A C#
Introducción Y Entorno
Creación De Proyecto C#
Introducción Y Entorno
Variables Y Constantes
Sintaxis
Tipos De Datos
Sintaxis
Operadores
Sintaxis
Control De Flujo
Sintaxis
Ejercicios de programación de CSharp
Evalúa tus conocimientos de esta lección LINQ básico con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.