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 normale return instructie - dit betekent het einde van de reeks. Normale return 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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow