Un enumerador es una estructura auxiliar que permite recorrer las estructuras dinámicas de forma secuencial. Casi todas ellas contienen un método GetEnumerator, que permite obtener un enumerador para recorrer todos sus elementos. Por ejemplo, en una tabla hash, para la que no podríamos aplicar un "for" para obtener los datos uno por uno, sí podríamos hacer:
// Ejemplo_11_06a.cs
// Ejemplo de Enumeradores en una Tabla Hash
// Introducción a C#, por Nacho Cabanes
using System;
using System.Collections;
public class Ejemplo_11_06a
{
public static void Main()
{
// Creamos e insertamos datos
Hashtable miDiccio = new Hashtable();
miDiccio.Add("byte", "8 bits");
miDiccio.Add("pc", "personal computer");
miDiccio.Add("kilobyte", "1024 bytes");
// Mostramos todos los datos
Console.WriteLine("Contenido:");
IDictionaryEnumerator miEnumerador = miDiccio.GetEnumerator();
while ( miEnumerador.MoveNext() )
Console.WriteLine("{0} = {1}",
miEnumerador.Key, miEnumerador.Value);
}
}
cuyo resultado es
Contenido:
pc = personal computer
byte = 8 bits
kilobyte = 1024 bytes
Como se puede ver, los enumeradores tendrán un método "MoveNext", que intenta moverse al siguiente elemento y devuelve "false" si no lo consigue. En el caso de las tablas hash, que tiene dos campos (clave y valor), el enumerador a usar será un "enumerador de diccionario" (IDictionaryEnumerator), que contiene los campos Key y Value.
Como se ve en el ejemplo, es habitual que no obtengamos la lista de elementos en el mismo orden en el que los introdujimos, debido a que se colocan siguiendo la función de dispersión.
Para las colecciones "normales", como las pilas y las colas, el tipo de Enumerador a usar será un IEnumerator, con un campo Current para saber el valor actual:
// Ejemplo_11_06b.cs
// Ejemplo de Enumeradores en una pila (Stack)
// Introducción a C#, por Nacho Cabanes
using System;
using System.Collections;
public class Ejemplo_11_06b
{
public static void Main()
{
Stack miPila = new Stack();
miPila.Push("Hola,");
miPila.Push("soy");
miPila.Push("yo");
// Mostramos todos los datos
Console.WriteLine("Contenido:");
IEnumerator miEnumerador = miPila.GetEnumerator();
while ( miEnumerador.MoveNext() )
Console.WriteLine("{0}", miEnumerador.Current);
}
}
que escribiría
Contenido:
yo
soy
Hola,
Nota: los "enumeradores" existen también en otras plataformas, como Java, aunque allí reciben el nombre de "iteradores".
Se puede saber más sobre las estructuras dinámicas que hay disponibles en la plataforma .Net consultando la referencia en línea de MSDN (mucha de la cual está sin traducir al español):
http://msdn.microsoft.com/es-es/library/system.collections(en-us,VS.71).aspx
Ejercicios propuestos:
Ejercicio propuesto 11.6.1: Crea un programa que, a partir de la SortedList del ejercicio 11.4.2.1, muestre todo su contenido usando un enumerador.
Ejercicio propuesto 11.6.2: A partir del ejercicio 11.3.1, crea un programa que pida al usuario 5 números reales de doble precisión, los guarde en una cola y luego los muestre en pantalla usando un enumerador.