Sök…


Anmärkningar

En iterator är en metod, få accessor eller operatör som utför en anpassad iteration över en matris eller samlingsklass genom att använda sökordet

Enkelt numeriskt Iterator-exempel

Ett vanligt fall för iteratorer är att utföra vissa operationer över en samling nummer. Exemplet nedan visar hur varje element i ett antal nummer kan skrivas ut individuellt till konsolen.

Detta är möjligt eftersom matriser implementerar IEnumerable gränssnittet, vilket gör det möjligt för klienter att få en iterator för matrisen med GetEnumerator() . Denna metod returnerar en uppräknare , som är en skrivskyddad, framåt-endast markör över varje nummer i matrisen.

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

IEnumerator iterator = numbers.GetEnumerator();

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

Produktion

1
2
3
4
5

Det är också möjligt att uppnå samma resultat med hjälp av en foreach uttalande:

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

Skapa Iteratorer med avkastning

Iteratorer producerar uppräknare. I C # produceras uppräknare genom att definiera metoder, egenskaper eller indexerare som innehåller yield .

De flesta metoder kommer att återvända kontrollen till deras ringer genom normala return uttalanden, som omhändertar alla statliga lokal denna metod. Däremot tillåter metoder som använder yield att returnera flera värden till den som ringer på begäran medan de bevarar det lokala tillståndet mellan att returnera dessa värden. Dessa returnerade värden utgör en sekvens. Det finns två typer av yield används inom iteratorer:

  • yield return , som returnerar kontrollen till den som ringer men behåller tillståndet. Callee fortsätter körningen från den här linjen när kontrollen skickas tillbaka till den.

  • yield break , som fungerar på liknande sätt som en normal return uttalande - detta innebär slutet av sekvensen. Normala return uttalanden själva är olagligt inom en iterator block.

Exemplet nedan visar en iteratormetod som kan användas för att generera Fibonacci-sekvensen :

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

Denna iterator kan sedan användas för att producera en uppräknare av Fibonacci-sekvensen som kan konsumeras med en anropsmetod. Koden nedan visar hur de första tio termerna i Fibonacci-sekvensen kan räknas upp:

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

Produktion

1
1
2
3
5
8
13
21
34
55


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow