miércoles, 29 de diciembre de 2010

Ordenar arreglos con Linq

Uno de los grandes logros personales de este año, fue empezar a trabajar con la tecnología Linq del .NET Framework 4.0, no sabía todas las bondades que tiene trabajar con este "nuevo" tipo de recursos que ofrece Microsoft y que realmente optimiza varios procesos además de agilizar mucho la codificación.

Para empezar con Linq es necesario estar dispuesto a olvidar muchas de las cosas de las antiguas tecnologías como ADO.NET y viejas maneras de trabajar con elementos como arreglos y listas, además parte fundamental del proceso de aprendizaje es repetir constantemente la palabra "NOO!!" o la frase "NO puede ser tan fácil!" así que espero que tras leer éste artículo me regalen un gran "NOOO!!! increible!"

--

En tiempos antiguos, donde el macho alfa era quien más líneas de código podía escribir sin volverse loco o atentar contra la integridad de sus grupo de trabajo, los procesos de organización de arreglos y cosas por el estilo eran un calvario y más cuando el profesor era uno de esos malditos que quería que todos supieran como se trabaja con el antiguo método burbuja (lo sé, muchos quizá piensen en mi).
Con linq, no es necesario hacer nada de ésto, es más ni siquiera es necesario utilizar ciclos repetitivos o la clase Array para organizar un arreglo, un ArrayList o un List, así que paso a explicar como es posible organizar un arreglo con Linq.
Empecemos con un Arreglo de Strings


   string[] x = new string[] {"a","b","c","d","e"};              
   var q = from f in x                      
           orderby f descending                      
           select f;              
   x = q.ToArray();
Con éste sencillo proceso, el arreglo x que está lleno de strings, queda ordenado de manera descendente. La última linea simplemente se encarga de almacenar el resultado que está en el objeto anonimo q de nuevo en la variable x para poderlo utilizar como un arreglo, pero para esta instancia el arreglo x está compuesto por las letras en orden descendente.
Ahora vamos a hacer un ordenamiento más complejo utilizando objetos de una clase dentro de una lista, para ello vamos a utilizar la clase Auto.

        public class Auto {
          public string marca { get; set; }
          public string color { get; set; }
          public string modelo { get; set; }
        }
Ahora vamos a crear una lista de objetos de tipo Auto para hacer varios ejercicios de consulta con Linq
List carros = new List();
carros.Add(new Auto() { marca="Renault", color="Negro", modelo="Logan" });
carros.Add(new Auto() { marca = "Mazda", color = "Blanco", modelo = "Mazda2" });
carros.Add(new Auto() { marca = "Renault", color = "Azul", modelo = "Twingo" });
Teniendo la lista creada vamos a crear las consultas de Linq necesarias para ordenar por medio de la marca, sin embargo, la consulta es igual para organizar los elementos por su color o por su modelo, lo único que debemos cambiar es el nombre del atribto por medio del cual queremos hacer que se organice la lista.

var q = from f in carros
                    orderby f.marca ascending
                    select f;
Ahora paso a describir un poco el funcionamiento de las consultas de Linq que estamos utlizando, estas consultas están basadas en la estructura de consulta del lenguaje SQL por lo tanto contamos con clausulas como el where, orderby, groupby, etc. La diferencia con las consultas de SQL está en el orden, ya que aquí debemos iniciar la consulta con la palabra reservada "from" después debemos poner el nombre de la variable temporal que almacenará la consulta, en este caso es "f", seguido de esto definimos el origen de los datos que es la lista carros, Podemos agregar las condiciones que queramos después de esa primera linea, así que podemos agregar la clausula where para crear condiciones o la clausula groupby para agrupar los elementos de acuerdo a un criterio. Finalmente agregamos "select f" que se encarga de hacer la consulta en el origen de datos ("carros") y almacena el resultado en el objeto anonimo q que se maneja como si fuera un objeto creado a partir de la Interfaz IEnumerable ya que cuenta con los mismos métodos y atributos.
Para obtener más información sobre Linq recomiendo que sigan el Blog de mi amigo Sergio, quien también cuenta con tutoriales y explicaciones de las nuevas tecnologías de .NET.

7 comentarios:

  1. Esoooo profe! por fin le metió Linq al blog! saludos...

    ResponderEliminar
  2. jajajaja hace mucho no le metía nada al blog, toca empezar...

    ResponderEliminar
  3. Está Interesante muy interesante, Eso si que nos ayudará,...¡¡¡ bien !!!

    ResponderEliminar
  4. jajajaj Carlos no piense que le voy a recibir el trabajo si me ordena los arreglos con Linq jajajaj

    ResponderEliminar
  5. jajajaj pero profe, es una elegancia hay que aprovechar, jajaja

    ResponderEliminar
  6. y mejora mucha mas con code first!

    ResponderEliminar