Share via


Iteradores (Guía de programación de C#)

Un iterador es un método, descriptor de acceso get u operador que realiza una iteración personalizada sobre una matriz o clase de colección utilizando la palabra clave yield. La instrucción de retorno yield hace que un elemento de la secuencia de origen sea devuelto inmediatamente al llamador antes de obtener acceso al elemento siguiente de la secuencia de origen. Aunque un iterador se escribe como un método, el compilador lo traduce en una clase anidada que es, en realidad, una máquina de estados. Esta clase hace un seguimiento de la posición del iterador mientras continúe el bucle foreach del código cliente.

Nota

Para ver lo que el compilador hace en segundo plano, utilice la herramienta ILDASM.exe que permite ver el código del lenguaje intermedio (IL) generado para un método iterador.

Un iterador se invoca desde el código cliente mediante una instrucción foreach. Por ejemplo, puede crear un iterador para una clase que devuelve los elementos en orden inverso o que realiza una operación sobre cada elemento antes de que el iterador lo devuelva. Al crear un iterador para una clase o struct, no tiene que implementar la interfaz IEnumerator completa. Cuando el compilador detecte el iterador, generará automáticamente los métodos Current, MoveNext y Dispose de la interfaz IEnumerator o IEnumerator<T>.

Información general sobre los iteradores

  • Un iterador es una sección de código que devuelve una secuencia ordenada de valores del mismo tipo.

  • Un iterador se puede utilizar como el cuerpo de un método, operador o descriptor de acceso get.

  • El código del iterador utiliza la instrucción yield return para devolver cada elemento a su vez. yield break finaliza la iteración.

  • Se pueden implementar varios iteradores en una clase. Cada iterador debe tener un nombre único, como cualquier miembro de clase, y se puede invocar mediante código cliente en una instrucción foreach de la manera siguiente: foreach(int x in SampleClass.Iterator2){}.

  • El tipo de valor devuelto de un iterador debe ser IEnumerable, IEnumerator, IEnumerable<T> o IEnumerator<T>.

  • Los iteradores son la base para el comportamiento de ejecución diferida en consultas de LINQ.

La palabra clave yield se utiliza para especificar el valor o los valores devueltos. Cuando se llega a la instrucción yield return, se almacena la ubicación actual. La ejecución se reinicia desde esta ubicación la próxima vez que se llame al iterador.

Los iteradores son especialmente útiles con las clases de colección, ya que proporcionan una manera fácil de recorrer en iteración estructuras de datos complejas, tales como los árboles binarios.

Secciones relacionadas

Para obtener más información:

Ejemplo

En este ejemplo, la clase DaysOfTheWeek es una clase de colección simple que almacena los días de la semana como cadenas. Después de cada iteración de un bucle foreach, se devuelve la cadena siguiente de la colección.

public class DaysOfTheWeek : System.Collections.IEnumerable
{
    string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };

    public System.Collections.IEnumerator GetEnumerator()
    {
        for (int i = 0; i < days.Length; i++)
        {
            yield return days[i];
        }
    }
}

class TestDaysOfTheWeek
{
    static void Main()
    {
        // Create an instance of the collection class
        DaysOfTheWeek week = new DaysOfTheWeek();

        // Iterate with foreach
        foreach (string day in week)
        {
            System.Console.Write(day + " ");
        }
    }
}
// Output: Sun Mon Tue Wed Thr Fri Sat

Especificación del lenguaje C#

Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

Genéricos (Guía de programación de C#)

Conceptos

Guía de programación de C#

Otros recursos

All About Iterators