Para la enumeración, cada elemento es una estructura KeyValuePair<TKey, TValue> que representa un valor y su clave.
La instrucción foreach del lenguaje C# (for each en C++, For Each en Visual Basic) oculta la complejidad de los enumeradores. Por tanto, se recomienda el uso de foreach en lugar de manipular directamente el enumerador.
Los enumeradores pueden utilizarse para leer los datos de la colección, pero no se pueden utilizar para modificar la colección subyacente.
Inicialmente, el enumerador se coloca antes del primer elemento de la colección. En esta posición, la propiedad Current queda sin definir. Por lo tanto, se debe llamar al método MoveNext para desplazar el enumerador hasta el primer elemento de la colección antes de leer el valor de Current.
Nota |
|---|
Para obtener un mejor rendimiento, el enumerador que devuelve esta propiedad no produce una excepción si se coloca antes del primer elemento o después del último y se obtiene acceso a la propiedad Current; el valor de la propiedad Current queda sin definir. |
La propiedad Current devuelve el mismo elemento hasta que se llama al método MoveNext.
MoveNext
establece Current en el elemento siguiente.
Si MoveNext pasa el final de la colección, el enumerador se coloca detrás del último elemento de la colección y MoveNext devuelve false. Cuando el enumerador está en esta posición, las llamadas posteriores al método MoveNext también devuelven false. Si la última llamada al método MoveNext devuelve false, el valor de la propiedad Current queda sin definir. No se puede volver a establecer la propiedad Current en el primer elemento de la colección, sino que se debe crear una nueva instancia del enumerador.
Mientras no se modifique la colección, el enumerador seguirá siendo válido. Si se realizan cambios en la colección, como agregar, modificar o eliminar elementos, el enumerador se invalida definitivamente y su comportamiento queda sin definir.
El enumerador no tiene acceso exclusivo a la colección; por lo tanto, la enumeración a través de una colección es un procedimiento que, por naturaleza, no es seguro para la ejecución de subprocesos. Para garantizar la seguridad en la ejecución de subprocesos durante la enumeración, puede bloquear la colección durante la enumeración completa. Para permitir que varios subprocesos obtengan acceso de lectura y escritura a la colección, debe implementar su propia sincronización.
Las implementaciones predeterminadas de las colecciones del espacio de nombres System.Collections.Generic no están sincronizadas.
Este método es una operación O(1).