Zum Hauptinhalt springen

Auflistungen mit "yield"-return durchlaufen

Um eine foreach-Schleife zu verwenden ist es erforderlich, dass das Interface IEnumerable eingebunden ist. Dieses Interface hat als einzige Methode GetEnumerator, welches ein Objekt zurückliefert, welches die Schnittstelle IEnumerator implementieren muss. Das IEnumerator-Interface hat wiederrum die Methoden MoveNext, Reset und die Property Current.

Beispiel

Haben wir z.B. eine Klasse, welche das Alphabet in einem Array speichert, welches wir mit einer foreach-Schleife durchlaufen, wollen müsste folgendes implementiert werden.

public class Alphabet
{
char[] alphabet =
{
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
};

public IEnumerable ListManuel
{
get
{
return new AlphabetEnumerable(alphabet);
}
}
}

public class AlphabetEnumerator : IEnumerator
{
private char[] alphabet;

private int position;

public AlphabetEnumerator(char[] alphabet)
{
position = -1;
this.alphabet = alphabet;
}

public object? Current
{
get
{
if (position == -1)
return null;
return this.alphabet[position];
}
}

public bool MoveNext()
{
position++;
return position < alphabet.Length;
}

public void Reset()
{
position = -1;
}
}

internal class Program
{
static void Main(string[] args)
{
foreach (char c in new Alphabet().ListManuel)
{
Console.WriteLine(c);
}
}
}

yield-Return

Wie im obigen Beispiel zu sehen, kann das implementieren des Interfaces IEnumerator relativ komplex sein. C# bietet uns allerdings die Möglichkeit, die Erstellung komplett dem Compiler zu überlassen und dafür das Schlüsselwort yield-return zu verwenden.

Das obige Beispiel kann mit Hilfe von yield, wie folgt verkürzt werden:

Vereinfachtes Beispiel mit yield-return

public class Alphabet
{
char[] alphabet =
{
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'
};

public IEnumerable ListYield
{
get
{
for (int i = 0; i < alphabet.Length; i++)
yield return alphabet[i];
}
}
}

internal class Program
{
static void Main(string[] args)
{
foreach (char c in new Alphabet().ListYield)
{
Console.WriteLine(c);
}
}
}

Kommentare