Buscar..


Observaciones

Un iterador es un método, acceso u operador que realiza una iteración personalizada sobre una matriz o clase de colección utilizando la palabra clave yield

Ejemplo de iterador numérico simple

Un caso de uso común para los iteradores es realizar alguna operación sobre una colección de números. El siguiente ejemplo muestra cómo cada elemento dentro de una matriz de números puede imprimirse individualmente en la consola.

Esto es posible porque los arreglos implementan la interfaz IEnumerable , permitiendo a los clientes obtener un iterador para el arreglo utilizando el método GetEnumerator() . Este método devuelve un enumerador , que es un cursor de solo lectura y solo de avance sobre cada número de la matriz.

int[] numbers = { 1, 2, 3, 4, 5 };

IEnumerator iterator = numbers.GetEnumerator();

while (iterator.MoveNext())
{
    Console.WriteLine(iterator.Current);
}

Salida

1
2
3
4
5

También es posible lograr los mismos resultados utilizando una declaración foreach :

foreach (int number in numbers)
{
    Console.WriteLine(number);
}

Creando iteradores usando el rendimiento

Los iteradores producen enumeradores. En C #, los enumeradores se producen mediante la definición de métodos, propiedades o indizadores que contienen declaraciones de yield .

La mayoría de los métodos devolverán el control a su interlocutor a través de declaraciones de return normales, lo que elimina todo el estado local de ese método. Por el contrario, los métodos que utilizan declaraciones de yield les permiten devolver múltiples valores al llamante a petición, al tiempo que conservan el estado local entre estos valores. Estos valores devueltos constituyen una secuencia. Hay dos tipos de declaraciones de yield utilizadas dentro de los iteradores:

  • yield return , que devuelve el control a la persona que llama pero conserva el estado. La persona que llama continuará la ejecución desde esta línea cuando se le devuelva el control.

  • yield break , que funciona de manera similar a una declaración de return normal, esto significa el final de la secuencia. Las declaraciones de return normales en sí mismas son ilegales dentro de un bloque iterador.

Este ejemplo a continuación demuestra un método de iterador que se puede usar para generar la secuencia de Fibonacci :

IEnumerable<int> Fibonacci(int count)
{
    int prev = 1;
    int curr = 1;
    
    for (int i = 0; i < count; i++)
    {
        yield return prev;
        int temp = prev + curr;
        prev = curr;
        curr = temp;
    }
}

Este iterador se puede usar para producir un enumerador de la secuencia de Fibonacci que puede ser consumido por un método de llamada. El siguiente código muestra cómo se pueden enumerar los primeros diez términos dentro de la secuencia de Fibonacci:

void Main()
{
    foreach (int term in Fibonacci(10))
    {
        Console.WriteLine(term);
    }
}

Salida

1
1
2
3
5
8
13
21
34
55


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow