Enumerar una colección
.NET Framework proporciona enumeradores para recorrer en iteración fácilmente por una colección. Los enumeradores sólo leen los datos de la colección; no pueden utilizarse para modificar la colección subyacente.
Algunos lenguajes proporcionan una instrucción que oculta la complejidad del uso de enumeradores directamente. La instrucción foreach de C#, la instrucción for each de C++ y la instrucción For Each de Visual Basic utilizan enumeradores.
Enumeradores
Un enumerador simplifica el uso de una colección de forma que se puede tener acceso a sus miembros secuencialmente. Diferentes clases de colecciones pueden tener diferentes secuencias. Por ejemplo, el enumerador de una colección ArrayList conserva el orden con que se introducen elementos en la colección, mientras que el de Hashtable muestra los elementos según su código hash.
Todos los enumeradores se basan en la interfaz IEnumerator o en la interfaz genérica IEnumerator, que requiere los siguientes miembros:
La propiedad Current indica el miembro actual de la colección.
La propiedad MoveNext mueve el enumerador al siguiente elemento de la colección.
La propiedad Reset mueve el enumerador al principio de la colección. Current se coloca delante del primer elemento. Reset no está disponible en la interfaz genérica IEnumerator.
Comportamiento de un enumerador
Inicialmente, el enumerador se coloca antes del primer elemento de la colección. Reset también devuelve el enumerador a esta posición. Current, por su parte, no queda definida en esta posición. Por tanto, antes de leer el valor de Current, deberá llamarse a MoveNext para hacer avanzar al enumerador hasta el primer elemento de la colección.
Current devuelve el mismo objeto hasta que se llama a MoveNext o a Reset. MoveNext establece Current en el siguiente elemento.
Si MoveNext rebasa el final de la colección, el enumerador quedará tras el último elemento y MoveNext devolverá false. Mientras el enumerador permanezca en esta posición, las llamadas a MoveNext seguirán devolviendo false. Cuando la última llamada a MoveNext haya devuelto false, Current quedará indefinida.
En colecciones no genéricas, puede llamarse a Reset seguida de MoveNext para devolver el enumerador al principio de la colección.
En colecciones no genéricas, no es posible volver a establecer Current en el primer elemento de la colección. En lugar de ello, deberá crearse una instancia de enumerador nueva.
Un enumerador es válido mientras la colección permanece inalterada. Cualquier cambio en la colección (por ejemplo, agregar, modificar o eliminar elementos) dejará al enumerador permanentemente invalidado y a su comportamiento, sin definir.
La enumeración en una colección no es un procedimiento seguro para subprocesos ya que el enumerador carece de acceso exclusivo. Para garantizar la seguridad de subprocesos, puede bloquearse la colección durante toda la enumeración. Para permitir a varios subprocesos el acceso de lectura y escritura a la colección, deberá implementarse una sincronización propia.
Vea también
Referencia
IEnumerator
IEnumerator
IDictionaryEnumerator
IEnumerable
IEnumerable