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