C# Language Utiliser les rendements pour créer un IEnumerator lors de l'implémentation de IEnumerable


Exemple

L'interface IEnumerable<T> possède une méthode unique, GetEnumerator() , qui renvoie un IEnumerator<T> .

Alors que le mot-clé yield peut être utilisé pour créer directement un IEnumerable<T> , il peut également être utilisé exactement de la même manière pour créer un IEnumerator<T> . La seule chose qui change est le type de retour de la méthode.

Cela peut être utile si nous voulons créer notre propre classe qui implémente IEnumerable<T> :

public class PrintingEnumerable<T> : IEnumerable<T>
{
    private IEnumerable<T> _wrapped;

    public PrintingEnumerable(IEnumerable<T> wrapped)
    {
        _wrapped = wrapped;
    }

    // This method returns an IEnumerator<T>, rather than an IEnumerable<T>
    // But the yield syntax and usage is identical.
    public IEnumerator<T> GetEnumerator()
    {
        foreach(var item in _wrapped)
        {
            Console.WriteLine("Yielding: " + item);
            yield return item;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

(Notez que cet exemple particulier est simplement illustratif et pourrait être implémenté plus proprement avec une seule méthode itérateur renvoyant un IEnumerable<T> .)