C# Language
iteratorer
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 normalreturn
uttalande - detta innebär slutet av sekvensen. Normalareturn
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