Ricerca…


Osservazioni

Un iteratore è un metodo, ottiene accessor o operatore che esegue un'iterazione personalizzata su una matrice o una classe di raccolta utilizzando la parola chiave yield

Esempio di Iterator numerico semplice

Un caso d'uso comune per gli iteratori consiste nell'eseguire alcune operazioni su una serie di numeri. L'esempio seguente mostra come ogni elemento all'interno di una matrice di numeri può essere stampato individualmente sulla console.

Ciò è possibile perché gli array implementano l'interfaccia IEnumerable , consentendo ai client di ottenere un iteratore per l'array utilizzando il metodo GetEnumerator() . Questo metodo restituisce un enumeratore , che è un cursore di sola lettura, forward-only su ciascun numero nell'array.

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

IEnumerator iterator = numbers.GetEnumerator();

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

Produzione

1
2
3
4
5

È anche possibile ottenere gli stessi risultati usando una dichiarazione foreach :

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

Creazione di iteratori con rendimento

Iteratori producono gli enumeratori. In C #, gli enumeratori vengono prodotti definendo metodi, proprietà o indicizzatori che contengono dichiarazioni di yield .

La maggior parte dei metodi restituirà il controllo al chiamante tramite normali dichiarazioni di return , che dispone di tutto lo stato locale per tale metodo. Al contrario, i metodi che utilizzano le dichiarazioni di yield consentono loro di restituire più valori al chiamante su richiesta, preservando allo stesso tempo lo stato locale nel restituire tali valori. Questi valori restituiti costituiscono una sequenza. Esistono due tipi di dichiarazioni di yield utilizzate all'interno degli iteratori:

  • yield return , che restituisce il controllo al chiamante ma mantiene lo stato. Il callee continuerà l'esecuzione da questa linea quando il controllo viene passato di nuovo ad esso.

  • yield break , che funziona in modo simile a una normale dichiarazione di return - questo indica la fine della sequenza. Le dichiarazioni di return normali sono illegali all'interno di un blocco iteratore.

Questo esempio di seguito mostra un metodo iteratore che può essere utilizzato per generare la sequenza di 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;
    }
}

Questo iteratore può quindi essere utilizzato per produrre un enumeratore della sequenza di Fibonacci che può essere utilizzata da un metodo di chiamata. Il seguente codice mostra come possono essere enumerati i primi dieci termini all'interno della sequenza di Fibonacci:

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

Produzione

1
1
2
3
5
8
13
21
34
55


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow