jueves, 8 de mayo de 2014

Receta No. 2-9 en C#: Ordenar un Arreglo o una Colección

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En esta nueva receta nos vamos a adentrar en el ordenamiento de elementos de estructuras de datos comunes: arreglos y colecciones. Vamos a utilizar métodos incorporados en el Framework .NET, de modo que la tarea de ordenamiento sea mucho más eficiente y rápida gracias al grado de sofisticación y optimización con los que han sido diseñados sus algoritmos.

1. Problema

Nos quedan dos aplicaciones por refactorizar y en la primera revisión del código fuente de estas se ha encontrado que se utilizan métodos personalizados (creados por los programadores que trabajaron en proyecto hace ya mucho tiempo) en los algoritmos para ordenar el contenido (elementos) de arreglos y colecciones.

2. Solución

Durante una revisión de la documentación disponible del .NET Framework en MSDN, los nuevos programadores encargados de la primera iteración de refactorización, han hallado varios artefactos de ordenamientos de arreglos y listas. Uno de ellos es OrderBy de la clase System.Linq.Enumerable. Otro método útil para ordenar arreglos de crecimiento dinámico: ArrayList.Sort.

3. Discusión de la Solución

Empecemos por describir el método OrderBy [4] de la clase Enumerable [2]. Con este método podemos ordenar una colección genérica (me extenderé en este tema en artículos futuros) o un arreglo convencional -cfr. Arreglos en C#-.

Uso de OrderBy para colecciones genéricas:

List<TipoDato> lista = new List<TipoDato>();
Enumerable.OrderBy(lista, x => x.Propiedad);

La primera línea señala que estamos creando una lista genérica con el tipo de dato TipoDato. Esta es la definición de TipoDato:

public class TipoDato
{
public string Propiedad
{
get;
set;
}

// resto de la implementación
}

Luego en la segunda línea ordenamos el contenido alfabético a través de la expresión lambda x => x.Propiedad; donde la propiedad Propiedad es el factor de ordenamiento.

En general, el ordenamiento de colecciones se consigue gracias a que todos los tipos genéricos implementan la interfaz IEnumerable [6].

Volviendo con la segunda línea de código de ejemplo de arriba, el método OrderBy retorna retorna una instancia del tipo IOrderedEnumerable [7], el cual nos va a permitir enumerar elementos de la estructura de datos en un ciclo for mejorado foreach [8].

Finalmente, para ordenar listas concretas, el método ArrayList.Sort [9] es idónea por esta tarea. Ejemplo de uso de este método:

ArrayList al = new ArrayList();
al.Add("OrtizOL");
al.Add("Experiencias");
al.Add("Construcción");
al.Add("Software");

al.Sort();

4. Práctica: Código Fuente C#

En este ejemplo vamos a poner en práctica el uso de los métodos expuestos. Y que nos serán de vital ayuda para la refactorización encomendada para los dos aplicaciones enunciada en la sección 1.


A resaltar el código del cuerpo del ciclo foreach en la línea 57: aquí podemos usar la propiedad Length para ordenar por la longitud de las cadenas de caracteres agregadas a la lista lista (List<String>).

Compilación:


  1. csc /target:exe UsoMetodosOrdenamiento.cs

> Prueba de ejecución.

Resultado:


Arreglo arregloEstandar ordenado: 
0.577215664901
1.618033988
2.71828182845905
3.14159265358979

Lista genérica ordenada:
Construcción
Experiencias
OrtizOL
Software

Lista 'lista' ordenada por longitud de cadena: 
OrtizOL
Software
Experiencias
Construcción

ArrayList 'al' ordenado:
Analista
Arquitecto
Desarrollador
Programador

5. Conclusiones

Existen métodos en Framework .NET para facilitar el ordenamiento de elementos de listas y colecciones optimizados y eficientes. Entre ellos, en esta receta, vimos OrderBy de Enumerable (namespace System.Linq) y Sort de ArrayList (namespace System.Collections). En especial, OrderBy facilita la especificación de expresiones lambda que facilita la especificación del factor de ordenamiento: elemento de colección o arreglo, o longitud de cadenas (como vimos en el ejemplo), orden alfabético, etc.).

6. Glosario

  • ArrayList
  • Arreglo
  • Colección
  • Euler
  • List
  • Media aureal
  • Ordenamiento
  • Ordenar
  • PI

7. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[5]: Arreglos en C# | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2013/09/arreglos-en-c.html
[6]: IEnumerable Interface (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx
[7]: IOrderedEnumerable(TElement) Interface (System.Linq) - http://msdn.microsoft.com/en-us/library/vstudio/bb534852%28v=vs.100%29.aspx


J

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.