Genéricos en C# (y II)

Una de las utilizaciones más comunes de genéricos se basa en la implementación y manipulación de colecciones fuertemente tipadas. En este apartado veremos muestras de cómo trabajar con los tipos de colecciones genéricas disponibles a partir de la versión 2.0 de NET Framework: la clase Dictionary<>, la clase List<>, la clase Queue<> y la clase Stack<>.

Clase Dictionary

Esta clase está diseñada para almacenar valores asociados a un valor de búsqueda. Tradicionalmente se ha usado esta clase para almacenar valores con cadenas, tales como nombres, palabras clave o GUIDs, pero además ahora podemos usar un objeto de cualquier tipo como clave y otro objeto de cualquier tipo como valor.

Ahora podemos especificar la clave y el tipo del valor al mismo tiempo de la creación del objeto usando parámetros de tipo, como se muestra en el siguiente fragmento de código:

// Diccionario de Prueba

Dictionary<string, int> diasMes = new Dictionary<string, int>();

diasMes[“Enero”] = 31;

diasMes[“Febrero”] = 28;

diasMes[“Marzo”] = 31;

Console.WriteLine(“Marzo tiene “ + diasMes[“Marzo”].ToString() + ” días.”);

Este ejemplo crea y manipula una clase Dictionary<> en la que todas las claves son cadenas, y todos los valores son números, almacenando el número de dias en cada mes.

Clase List

La clase List<> se explica por si misma fácilmente. Su único propósito es almacenar una lista de items. Sin genéricos, las listas eran responsabilidad de un conjunto de tipos System.Object y cuando el desarrollador necesitaba un tipo de datos fuera de ella, debía incluir operaciones de conversión de tipos y código potencialmente enrevesado. En el siguiente ejemplo vemos como crear y usar arbitrariamente listas de datos fuertemente tipados nunca había sido tan fácil:

// Clase List

List<Cliente> listaClientes = new List<Cliente>();

Cliente nuevoCli = new Cliente();

nuevoCli.Apellido = “Hoffman”;

nuevoCli.Nombre = “Kevin”;

nuevoCli.IDCliente = 1;

listaClientes.Add(nuevoCli);

Console.WriteLine(string.Format(“Hay {0} clientes, el primero es {1} {2}”, listaClientes.Count, listaClientes[0].Nombre, listaClientes[0].Apellido));

El código precedente produce la siguiente salida:

Hay un clientes, el primero es Kevin Hoffman

Conviene fijarse en el hecho de que ahora podemos escribir código como el siguiente sin tener que escribir ninguna de nuestras propias clases para ello:

listaClientes[0].Nombre

Antes, para obtener una lista como la mostrada en este ejemplo, los desarrolladores solían pasar muchas horas creando sus propias clases de colección fuertemente tipadas. Ahora podemos crearlas en tiempo de ejecución sin pérdida de rendimiento y sin necesidad de hacer conversión de tipos de forma que el código es más sencillo y reutilizable.

Clase Queue

La clase Queue no es más que una cola FIFO (First In First Out). Esta clase nos permite especificar el tipo de datos de los elementos en una cola al momento de la instanciación, como se muestra en el siguiente ejemplo:

Queue<Cliente> cClientes = new Queue<Cliente>();

cClientes.Enqueue(nuevoCli);

Cliente dqCli = cClientes.Dequeue();

Console.WriteLine(string.Format(“Extraido de la cola el siguiente cliente: {0} {1}”,dqCli.Nombre, dqCli.Apellido));

Clase Stack

Al contrario que la clase Queue<>, la clase Stack<> es una colección LIFO (Last-in First-out), es decir, una pila.  El siguiente código muestra como colocar elementos en una pila genérica y como obtenerlos. Para asegurarnos de saber cómo trabaja la pila, podemos jugar con el cambio de orden en el que colocamos los items para ver los resultados:

Stack<Cliente> pilaClientes = new Stack<Cliente>();

Cliente cli1 = new Cliente();

cli1.Nombre = “John”;

cli1.Apellido = “Doe”;

cli1.IDCliente = 99;

pilaClientes.Push(nuevoCli);

pilaClientes.Push(cli1);

Cliente popCli = pilaClientes.Pop();

Console.WriteLine(string.Format(“El Cliente extraido de la pila es {0} {1}”,popCli.Nombre, popCli.Apellido));

 

* Basado en traducción propia de Visual C# 2005 Unleashed de Kevin Hoffman

Deja una respuesta