C# Language
iterators
Zoeken…
Opmerkingen
Een iterator is een methode, een accessor of een operator die een aangepaste iteratie uitvoert over een array of verzamelklasse met behulp van het opbrengstwoord
Eenvoudig numeriek Iterator-voorbeeld
Een veelvoorkomende use-case voor iterators is het uitvoeren van een bewerking over een verzameling getallen. Het onderstaande voorbeeld laat zien hoe elk element binnen een reeks getallen afzonderlijk naar de console kan worden afgedrukt.
Dit is mogelijk omdat arrays de IEnumerable
interface implementeren, waardoor clients een iterator voor de array kunnen verkrijgen met behulp van de methode GetEnumerator()
. Deze methode retourneert een teller , die een alleen-lezen, alleen-voorwaartse cursor over elk nummer in de array is.
int[] numbers = { 1, 2, 3, 4, 5 };
IEnumerator iterator = numbers.GetEnumerator();
while (iterator.MoveNext())
{
Console.WriteLine(iterator.Current);
}
uitgang
1
2
3
4
5
Het is ook mogelijk om dezelfde resultaten te bereiken met behulp van een foreach
instructie:
foreach (int number in numbers)
{
Console.WriteLine(number);
}
Iterators maken met opbrengst
Iterators produceren enumerators. In C # worden opsommers geproduceerd door methoden, eigenschappen of indexers te definiëren die yield
bevatten.
De meeste methoden zullen de besturing terugsturen naar hun beller door middel van normale return
, waarbij alle lokale toestanden voor die methode worden verwijderd. Met methoden die yield
gebruiken yield
kunnen ze daarentegen op verzoek meerdere waarden aan de beller retourneren, met behoud van de lokale status tussen het retourneren van die waarden. Deze geretourneerde waarden vormen een reeks. Er zijn twee soorten yield
die binnen iterators worden gebruikt:
yield return
, dat controle teruggeeft aan de beller maar status behoudt. De callee zal de uitvoering van deze lijn voortzetten wanneer de controle eraan wordt teruggegeven.yield break
, die vergelijkbaar is met een normalereturn
instructie - dit betekent het einde van de reeks. Normalereturn
zelf zijn illegaal binnen een iteratorblok.
Dit onderstaande voorbeeld demonstreert een iteratiemethode die kan worden gebruikt om de Fibonacci-reeks te genereren:
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;
}
}
Deze iterator kan vervolgens worden gebruikt om een teller van de Fibonacci-reeks te produceren die door een aanroepmethode kan worden gebruikt. De onderstaande code laat zien hoe de eerste tien termen in de Fibonacci-reeks kunnen worden opgesomd:
void Main()
{
foreach (int term in Fibonacci(10))
{
Console.WriteLine(term);
}
}
uitgang
1
1
2
3
5
8
13
21
34
55