Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

8.6. Los "enumeradores"

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 podríamos hacer:

/*---------------------------*/
/*  Ejemplo en C#            */
/*  HashTable3.cs            */
/*                           */
/*  Ejemplo de HashTable     */
/*  y enumerador             */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
using System.Collections;
public class ejemploHashTable3  {
 
   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 en C#            */
/*  pila2.cs                 */
/*                           */
/*  Ejemplo de clase "Stack" */
/*  y enumerador             */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
using System.Collections;
 
public class ejemploPila1  {
 
   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#