Cargando...

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.

Artículos relacionados