domingo, 24 de septiembre de 2017

Listas, Colas, Pilas y Conjuntos en C# - Parte 1/6: List(T) y ArrayList

Índice

1. Introducción
2. Palabras Clave
3. List<T>
4. ArrayList
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

A partir de este artículo empezamos con una nueva serie llamada Listas, Colas, Pilas y Conjuntos en C#. Esta serie busca hacer una introducción por cada una de estas estructuras de datos o colecciones que implementan las interfaces descritas en anteriormente (Interfaces ICollection y IList en C# - Parte 1/2). Se resaltará la importancia de las implementaciones genéricas; en especial su rendimiento superior respecto a las versiones no-genéricas (disponibles para casos de compatibilidad).


Empezamos con dos clases: List<T> y ArrayList. Clases de uso común para la manipulación de datos que siguen un patrón de organización de sus elementos basado en listas y con acceso con índices.

2. Palabras Clave

  • Algoritmo
  • Arreglo
  • Colección
  • Compatibilidad
  • Estructura de datos
  • Lista

3. List<T>

Clase que implementa las versiones de interfaces IList y IList<T>. Los elementos se acceden a través de un índice, y cuenta con operaciones para ordenar, buscar y manipular sus elementos.

La Figura 1 presenta el grupo de interfaces que implementa esta clase genérica:
Interfaces de List
Figura 1. Interfaces de List ("List(T) Class", 2017).
Al interior de la clase, los elementos se almacenan en un arreglo de objetos; cuando la capacidad de este arreglo es superada se reemplaza por un arreglo de mayor capacidad. Respecto a lo anterior hay que considerar que la operación de inserción resulta lenta debido a que los elementos después del punto de inserción se deben desplazar para almacenar el elemento insertado. Sin embargo, añadir un elemento al final de la lista es rápido (Albahari, 2012).

Buscar elementos es realmente eficiente por medio del algoritmo de búsqueda binaria; al igual que en los arreglos. A comparación con ArrayList, IList<T> es varias veces más efciente debido a que no es necesario efectuar operaciones de boxing y unboxing (Boxing y Unboxing en C#).

Veamos un ejemplo de uso:

List<string> tresMaestros = new List<string>
tresMaestros.Add("Dostoievski");
tresMaestros.AddRange (new [] {"Balzac", "Dickens"});
tresMaestros.Remove("Balzac");
tresMaestros.Insert(0, "Balzac");

tresMaestros.RemoveAt(1); // Remueve el 2do elemento
tresMaestros.RemoveRange(0, 2);

tresMaestros.AddRange (new [] {"Balzac", "Dickens", "Dostoevski"});

tresMaestros.RemoveAll( e =< e.StartsWith("M"));

List<int> longitudNombres = tresMaestros.ConvertAll( e =<T> e.Length);

foreach(string e in tresMaestros){
    Console.WriteLine(e);
}

Existen otros métodos interesantes, como:
  • GetRange
  • Copy
  • ToArray

4. ArrayList

La clase no-genérica ArrayList ("ArrayList Class", 2017), al igual que List<T>, crece o decrece de forma dinámica a medida que se adicionan o remueven elementos. Como advierte Albahari (2012): "ArrayList class is used for backward compatibility with Framework 1.x" Es decir, el programador cuenta con una estructura de datos para soportar requerimientos funcionales o adaptaciones a versiones de la serie 1.x de .NET Framework.

De forma análoga al código anterior, con esta clase podemos escribir:

ArrayList tresMaestros = new ArrayList();
tresMaestros.Add ("Dostoievski");
tresMaestros.AddRange(new [] {"Balzac", "Dickens"});

Para recuperar elementos es necesario hacer un casting o conversión de los elementos:

string dostoievski = (string) tresMestros[0];

Las conversiones a tipos de datos no compatibles con string se efectúan en tiempo de ejecución -i.e., el compilador no las puede verificiar-:

int primerEscritor = (int) tresMaestros[0];

Como punto adicional, la clase System.Linq.Cast permite convetir un objeto ArrayList a un objeto List<T>:

ArrayList numerosPrimos = new ArrayList();
numerosPrimos.AddRange (new[] {2, 91, 101});
List<int> listaNumerosPrimos = numerosPrimos.Cast<int>().ToList();

5. Conclusiones

Exploramos en este artículo dos clases basadas en índices y con la diferencia resaltada de genericidad: List<T> y ArrayList. Se entendió que ArrayList está disponible para suplir requerimientos de compatibilidad hacia atrás, en particular con .NET Framework 1.x. Se presentaron los ejemplos de uso prácticos para conocer la funcionalidad ofrecida a través de métodos de estas dos clases.

En el próximo artículo nos adentraremos en la exposición conceptual de la clase LinkedList<T>.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
List(T) Class (System.Collections.Generic) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx
Boxing y Unboxing en C# (2012). Recuperado desde: https://ortizol.blogspot.com.co/2014/03/boxing-y-unboxing-en-c.html
ArrayList Class (System.Collections) (2017). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.collections.arraylist(v=VS.100).aspx


O

No hay comentarios:

Publicar un comentario

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