Szukaj…


Uwagi

Iterator to metoda, get accessor lub operator, który wykonuje niestandardową iterację na tablicy lub klasie kolekcji za pomocą słowa kluczowego fed

Prosty przykład iteratora numerycznego

Typowym przypadkiem użycia iteratorów jest wykonanie pewnej operacji na zbiorze liczb. Poniższy przykład pokazuje, w jaki sposób każdy element z tablicy liczb można wydrukować indywidualnie na konsoli.

Jest to możliwe, ponieważ tablice implementują interfejs IEnumerable , umożliwiając klientom uzyskanie iteratora dla tablicy za pomocą metody GetEnumerator() . Ta metoda zwraca moduł wyliczający , który jest kursorem tylko do odczytu i tylko do przodu nad każdą liczbą w tablicy.

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

IEnumerator iterator = numbers.GetEnumerator();

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

Wynik

1
2
3
4
5

Możliwe jest również osiągnięcie tych samych wyników za pomocą instrukcji foreach :

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

Tworzenie iteratorów przy użyciu wydajności

Iteratory produkują liczniki. W języku C # moduły wyliczające są tworzone przez zdefiniowanie metod, właściwości lub indeksatorów zawierających instrukcje dotyczące yield .

Większość metod zwróci kontrolę nad swoim wywołującym za pomocą normalnych instrukcji return , które usuwają wszystkie stany lokalne względem tej metody. W przeciwieństwie do metod, które używają yield sprawozdań pozwalają im zwracać wiele wartości do rozmówcy na żądanie przy zachowaniu stanu lokalnego w między powrocie tych wartości. Te zwracane wartości stanowią sekwencję. Istnieją dwa rodzaje yield oświadczeń stosowanych w iteratorów:

  • yield return , który zwraca kontrolę nad abonentem wywołującym, ale zachowuje stan. Odbiorca będzie kontynuował wykonywanie z tej linii, gdy kontrola zostanie do niej ponownie przekazana.

  • yield break , który działa podobnie do normalnej instrukcji return - oznacza to koniec sekwencji. Same normalne instrukcje return są nielegalne w bloku iteratora.

W poniższym przykładzie pokazano metodę iteratora, której można użyć do wygenerowania sekwencji Fibonacciego :

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;
    }
}

Ten iterator można następnie wykorzystać do wytworzenia modułu wyliczającego sekwencję Fibonacciego, który może być wykorzystany przez metodę wywołującą. Poniższy kod pokazuje, jak można wyliczyć pierwsze dziesięć terminów w sekwencji Fibonacciego:

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

Wynik

1
1
2
3
5
8
13
21
34
55


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow