LINQ en 3 minutos – Tutorial de C#

Comment

Informática

LINQ, acrónimo de: “Lenguage Integrate Query“, es un conjunto de herramientas introducida por Microsoft para su plataforma .NET. Este se caracteriza por parecerse mucho a sentencias SQL (select in e, where … select… etc… lo verás en breve…) haciendo mas fácil poder hacer consultas a diferentes objetos en c# y VB.net.

¡wow, si hubiera sabido que esto existía, hubiera terminado mi práctica de programación con 100 puntos!

~ yo, el año pasado.

LINQ es útil al momento de hacer consultas dentro de colecciones como: listas, arreglos, cadenas de caracteres (Sí, un string es un arreglo de caracteres) y un sin fin de cosas más. Con LINQ puedes ordenar listas de mayor a menor y viceversa, saber cuantas vocales tiene una palabra u oración (¿y por qué no? hasta párrafos completos), filtrar resultados y muchas cosas mas por el estilo.

 

Sin mas prámbulos, empecemos con LINQ:

Situación No. 1:

Digamos que tienes una lista de números en C# y quieres organizarlas de mayor a menor.

  1. static void Main(string[] args)
  2. {
  3.     List listaDeNumeros = new List() { 5,6,9,8,7,4,1,2,10,2,3,6,9,8};
  4. }

Quizá lo que harías es hacer otra lista para así entrar los números ordenadamente dentro de ella ¿No?
bahh, grave error.
pss, mira que con LINQ se hace mucho más rápido, fácil y con menos líneas de código:

  1. static void Main(string[] args)
  2. {
  3.     List listaDeNumeros = new List() { 5,6,9,8,7,4,1,2,10,2,3,6,9,8};
  4.  
  5.     //aqui empieza la magia; esto es LINQ
  6.     var consulta = from c in listaDeNumeros
  7.     orderby c
  8.     select c;
  9. }

Vamos a explicar detalladamente y línea por línea este conjunto de código.

Lo que está planteando la línea #06 es que: “C será una variable temporal y de dominio que tomará todos los valores que contiene el arreglo listaDeNumeros”.

La linea #07 es un filtro que dice: “Ordéname todos los elementos que contiene la variable c en esta consulta de menor a mayor”.

Y por último, la línea #08 es para seleccionar todos los elementos ya ordenados en la variable c y contenerlos en la variable “consulta”.

Ahora, utilizaremos un Foreach par imprimir la lista y la variable de consulta:

  1. static void Main(string[] args)
  2. {
  3.     List listaDeNumeros = new List() { 5,6,9,8,7,4,1,2,10,2,3,6,9,8};
  4.  
  5.     //aqui empieza la magia; esto es LINQ
  6.     var consulta = from c in listaDeNumeros
  7.     orderby c
  8.     select c;
  9.  
  10.     Console.WriteLine("Impresion de la lista con una consulta LINQ:");
  11.    
  12.     foreach (var i in consulta)
  13.     {
  14.         Console.Write(i+", ");
  15.     }
  16.  
  17.     Console.WriteLine("\n\nImpresion de la lista original:");
  18.     foreach (var i in listaDeNumeros)
  19.     {
  20.         Console.Write(i + ", ");
  21.     }
  22. }

Al ejecutarlo este código, obtienes esto en pantalla:

 

Organizado como por arte de mágia.

 

Tambien puedes ordenarlos de mayor a menor solo editando la línea #07, que contiene la condición a filtrar dentro de la consulta añadiendo la instrucción “descending” al final del mandato:

  1. orderby c descending

y obtienes este resultado:

De mayor a menor sin ningun esfuerzo

Situación No. 2:

Quieres organizar cada una de tus colecciones por un grupo en especifico (y sí, déjame decirte que puedes hacerlo).

Así como puedes hacerlo usando diccionarios, con LINQ puedes hacer una agrupación de colecciones mediante un filtrado. ¿Quieres que tu lista se organize por grupos de precios, o que se organize por nombre alfabético?

Veamos a continuación:

 

Tenemos un objeto “Producto” en nuestro proyecto:

  1. class Producto
  2. {
  3.     private string nombre;
  4.     private double precio;
  5.  
  6.     public Producto(string nombre, double precio)
  7.     {
  8.         this.nombre = nombre;
  9.         this.precio = precio;
  10.     }
  11.  
  12.     public string getNombre()
  13.     {
  14.         return nombre;
  15.     }
  16.     public double getPrecio()
  17.     {
  18.         return precio;
  19.     }
  20. }

El producto guarda un precio y un nombre predeterminado. algo básico… creo que no necesitaremos mas de ahí para explicar lo que viene a continuación.

En nuestra Tester Class tenemos una lista de productos con sus respectivos productos y una consulta LINQ.

  1. static void Main(string[] args)
  2. {
  3.     List productos = new List {
  4.         new Producto("Nintendo Switch", 80),
  5.         new Producto("Xbox One X (xox)", 10),
  6.         new Producto("Playstation 4 Pro", 80),
  7.         new Producto("Uncharted Millenial Edition", 50.5),
  8.         new Producto("Wii U (ded)", 100),
  9.     };
  10.  
  11.     //Consulta LINQ
  12.     var consulta = from c in productos
  13.     group c by c.getPrecio();
  14.  
  15.     //impresion del grupo con foreach
  16.     foreach (var a in consulta)
  17.     {
  18.         Console.WriteLine("Grupo de precio: {0}", a.Key);
  19.  
  20.         foreach (var i in a)
  21.         {
  22.             Console.WriteLine("\tNombre: {0} - Precio {1}", i.getNombre(), i.getPrecio());
  23.         }
  24.     }
  25.  
  26.     Console.ReadKey(); //lo paro (?)
  27. }

En esta consulta LINQ lo que planteamos es lo siguiente:

En la linea #12, se hace el proceso de obtener todos datos del arreglo en una variable temporal llamada C como el el ejemplo anterior.

En la línea #13 sucede algo diferente: la sentencia no termina con Select y ahora vemos una directiva nueva. ¿Qué significa “group c by c.getPrecio()”? Esto es: Agrupa cada una de los elementos de mis colecciones por la condición que te acabo de dar (En este caso, el precio). Esta sentencia agrupará cada una de las colecciones tomando como referencia el precio del producto.

En la línea #18 vemos algo nuevo, ¿Cómo que a.Key?
a.Key lo que hace es tomar la condición que nosotros hicimos en el agrupamiento de la línea 13 y agrupar dentro de la misma en base a esa condición todos los elementos que la cumple.

linq coleccion Ienumerable.key

Mejor de ahí, podría dañarse.

Ahora, en el foreach que se encuentra imprimiendo las colecciones que están dentro de “a.key” se acceden a su valor usando los métodos definidos anteriormente en nuesta clase “producto”, para así, obtener su nombre y su precio. Al compilar obtenemos esto en pantalla:

linq grouping

Por grupos (el Wii u está ded, lol).

Puedes usar esta herramienta para hacer agendas, clasificar productos por alguna característica en especifico… ¡Las posibilidades son ilimitadas! el único límite aquí es tu imaginación 🙂

¿Te parece muy útil LINQ? ¿Crees que hay algo mas que puedas aportar en esta explicación?

¡Siéntete libre de expresarte en la caja de comentarios!

¿Te gustó este post? ¡Puedes ayudarme a hacer mas contenido de calidad apoyándome en Patreon!
The following two tabs change content below.

Kevin Hernandez

Estudiante de Ciencias de la Computación en la UASD, amante de la tecnología y el avance de la informática durante el paso del tiempo. Creador del Canal "Blog del Kevo" en Youtube y blogger a medio tiempo. Mis pasatiempos son Programar, tocar la guitarra y beber cerveza.