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.
Ejercicios de esta lección LINQ básico
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.
CRUD en C# de modelo Customer sobre una lista
Arrays y listas
Objetos
Excepciones
Eventos
Lambdas
Diccionarios en C#
Variables y constantes
Tipos de datos
Herencia
Operadores
Uso de consultas LINQ
Clases y encapsulación
Uso de consultas LINQ
Excepciones
Control de flujo
Eventos
Diccionarios
Tipos de datos
Conjuntos, colas y pilas
Lambdas
Conjuntos, colas y pilas
Uso de async y await
Tareas
Constructores y destructores
Operadores
Arrays y listas
Polimorfismo
Polimorfismo
Variables y constantes
Proyecto colecciones y LINQ en C#
Clases y encapsulación
Creación de proyecto C#
Uso de async y await
Funciones
Delegados
Delegados
Constructores y destructores
Objetos
Control de flujo
Funciones
Tareas
Proyecto sintaxis en C#
Herencia C Sharp
OOP en C Sharp
Diccionarios
Introducción a C#
Todas las 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
Funciones
Sintaxis
Estructuras De Control Iterativo
Sintaxis
Interpolación De Strings
Sintaxis
Estructuras De Control Condicional
Sintaxis
Manejo De Valores Nulos
Sintaxis
Clases Y Encapsulación
Programación Orientada A Objetos
Objetos
Programación Orientada A Objetos
Constructores Y Destructores
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Genéricos
Programación Orientada A Objetos
Métodos Virtuales Y Sobrecarga
Programación Orientada A Objetos
Clases Abstractas
Programación Orientada A Objetos
Interfaces
Programación Orientada A Objetos
Propiedades Y Encapsulación
Programación Orientada A Objetos
Métodos De Extensión
Programación Orientada A Objetos
Clases Y Objetos
Programación Orientada A Objetos
Clases Parciales
Programación Orientada A Objetos
Miembros Estáticos
Programación Orientada A Objetos
Tuplas Y Tipos Anónimos
Programación Orientada A Objetos
Arrays Y Listas
Colecciones Y Linq
Diccionarios
Colecciones Y Linq
Conjuntos, Colas Y Pilas
Colecciones Y Linq
Uso De Consultas Linq
Colecciones Y Linq
Linq Avanzado
Colecciones Y Linq
Colas Y Pilas
Colecciones Y Linq
Conjuntos
Colecciones Y Linq
Linq Básico
Colecciones Y Linq
Delegados Funcionales
Programación Funcional
Records
Programación Funcional
Expresiones Lambda
Programación Funcional
Linq Funcional
Programación Funcional
Fundamentos De La Programación Funcional
Programación Funcional
Pattern Matching
Programación Funcional
Testing Unitario Con Xunit
Testing
Excepciones
Excepciones
Delegados
Programación Asíncrona
Eventos
Programación Asíncrona
Lambdas
Programación Asíncrona
Uso De Async Y Await
Programación Asíncrona
Tareas
Programación Asíncrona
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la sintaxis básica de LINQ y su similitud con SQL.
- Aprender a utilizar operadores fundamentales como where, select y orderby.
- Saber cómo trabajar con colecciones de objetos y aplicar consultas LINQ.
- Entender el uso de operadores de agrupación y agregación en LINQ.
- Conocer el concepto de ejecución diferida y cómo controlar la ejecución de consultas.