C# Language
Iteratory
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 instrukcjireturn
- oznacza to koniec sekwencji. Same normalne instrukcjereturn
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