Métodos LINQ comunes en C#
LINQ (Consulta Integrada del Lenguaje) ofrece un amplio conjunto de métodos para consultar y manipular datos en C#. A continuación, se muestran ejemplos de algunos métodos LINQ de uso común:
1. Where
El método Where filtra elementos según una condición.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Where(num => num > 2).ToList();
foreach (var num in result)
{
Console.WriteLine(num); // Salida: 3, 4, 5
}
2. Select
El método Select proyecta cada elemento de una secuencia en una nueva forma.
string[] fruits = { "apple", "banana", "cherry" };
var result = fruits.Select(fruit => fruit.ToUpper()).ToList();
foreach (var fruit in result)
{
Console.WriteLine(fruit); // Salida: MANZANA, PLÁTANO, CEREZA
}
3. Ordenar por
El método OrderBy ordena los elementos en orden ascendente.
string[] fruits = { "manzana", "plátano", "cereza" };
var result = fruits.Select(fruit => fruit.ToUpper()).ToList();
foreach (var fruit in result)
{
Console.WriteLine(fruit); // Salida: MANZANA, PLÁTANO, CEREZA
}
4. Ordenar por descendente
El método OrderByDescending ordena los elementos en orden descendente.
int[] números = { 5, 2, 7, 1, 3 };
var resultado = números.OrderByDescending(num => num).ToList();
foreach (var num in resultado)
{
Console.WriteLine(num); // Salida: 7, 5, 3, 2, 1
}
5. First
El método First devuelve el primer elemento de una secuencia que cumple una condición.
int[] números = { 1, 2, 3, 4, 5 };
var resultado = números.First(num => num > 2);
Console.WriteLine(resultado); // Salida: 3
6. FirstOrDefault
El método FirstOrDefault devuelve el primer elemento de una secuencia que cumple una condición, o un valor predeterminado si no se encuentra dicho elemento.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.FirstOrDefault(num => num > 5);
Console.WriteLine(result); // Salida: 0 (valor predeterminado para int)
7. Any
El método Any determina si algún elemento de una secuencia cumple una condición.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Any(num => num > 3);
Console.WriteLine(result); // Resultado: Verdadero
8. All
El método All determina si todos los elementos de una secuencia cumplen una condición.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.All(num => num > 0);
Console.WriteLine(result); // Resultado: Verdadero
9. Count
El método Count devuelve el número de elementos de una secuencia.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Count();
Console.WriteLine(result); // Resultado: 5
10. Sum
El método Sum calcula la suma de la secuencia de valores numéricos.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Sum();
Console.WriteLine(result); // Resultado: 15
11. Average
El método Average calcula el promedio de la secuencia de valores numéricos.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Average();
Console.WriteLine(result); // Resultado: 3
12. Mín
El método Mín devuelve el valor mínimo de una secuencia.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Min();
Console.WriteLine(result); // Salida: 1
13. Máx
El método Máx devuelve el valor máximo de una secuencia.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Max();
Console.WriteLine(result); // Salida: 5
14. Take
El método Take devuelve un número específico de elementos contiguos desde el inicio de una secuencia.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Take(3).ToList();
foreach (var num in result)
{
Console.WriteLine(num); // Salida: 1, 2, 3
}
15. Skip
El método Skip omite un número específico de elementos en una secuencia y luego devuelve los elementos restantes.
int[] numbers = { 1, 2, 3, 4, 5 };
var result = numbers.Skip(2).ToList();
foreach (var num in result)
{
Console.WriteLine(num); // Salida: 3, 4, 5
}
16. Distinct
El método Distinct devuelve elementos distintos de una secuencia utilizando el comparador de igualdad predeterminado para comparar valores.
int[] numbers = { 1, 2, 2, 3, 4, 4, 5 };
var result = numbers.Distinct();
foreach (var num en resultado)
{
Console.WriteLine(num); // Salida: 1, 2, 3, 4, 5
}
Uso de LINQ con colecciones y bases de datos
LINQ es muy flexible porque se puede aplicar tanto a colecciones en memoria (arrays, listas, diccionarios, etc.) como a fuentes de datos externas como bases de datos mediante Entity Framework.
LINQ con colecciones en memoria
Cualquier colección que implemente IEnumerable<T> puede ser consultada con LINQ.
Ejemplo con una lista
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// Consulta con sintaxis de consulta
var query = from num in numbers
where num > 2
orderby num descending
select num;
// Consulta con sintaxis de métodos
var methodQuery = numbers
.Where(num => num > 2)
.OrderByDescending(num => num);
foreach (var num in query)
{
Console.WriteLine(num); // Imprime: 5, 4, 3
}
Ejemplo con diccionario
Dictionary<string, int> students = new Dictionary<string, int>
{
{ "Ana", 18 },
{ "Luis", 22 },
{ "Pedro", 19 }
};
var mayoresDeEdad = students
.Where(s => s.Value >= 18)
.Select(s => s.Key);
foreach (var nombre in mayoresDeEdad)
{
Console.WriteLine(nombre); // Imprime: Ana, Luis, Pedro
}
LINQ con bases de datos
Con Entity Framework (EF Core), LINQ permite trabajar con tablas como si fueran colecciones.
Ejemplo básico
using (var context = new AppDbContext())
{
var estudiantes = from e in context.Students
where e.Age > 18
orderby e.Name
select e;
foreach (var estudiante in estudiantes)
{
Console.WriteLine($"{estudiante.Name} - {estudiante.Age}");
}
}
Ejemplo con sintaxis de métodos
using (var context = new AppDbContext())
{
var estudiantes = context.Students
.Where(e => e.Age > 18)
.OrderBy(e => e.Name)
.ToList();
estudiantes.ForEach(e =>
Console.WriteLine($"{e.Name} - {e.Age}")
);
}