Looking for c# Keywords? Try Ask4Keywords

C# Language Использование yield для создания IEnumerator при внедрении IEnumerable


пример

Интерфейс IEnumerable<T> имеет единственный метод GetEnumerator() , который возвращает IEnumerator<T> .

Хотя ключевое слово yield можно использовать для непосредственного создания IEnumerable<T> , его также можно использовать точно так же, чтобы создать IEnumerator<T> . Единственное, что изменяется, это тип возвращаемого метода.

Это может быть полезно, если мы хотим создать собственный класс, который реализует 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();
    }
}

(Обратите внимание, что этот конкретный пример является просто иллюстративным и может быть более чисто реализован с помощью одного метода итератора, возвращающего IEnumerable<T> .)