Что такое итераторы и генераторы С# и как их использовать

Я разработчик VB.Net, новичок в С#. Просматривая документацию по С#, я просматривал итераторы и генераторы, не мог полностью понять их использование, я нашел любого, кто может объяснить (в проницательности vb, если возможно)


person Rajeev    schedule 22.09.2010    source источник
comment
Итераторы чаще всего используются для обхода списков разных типов. Итераторы называются Enumerators в .net. Другой вопрос, касающийся итераторов: stackoverflow. ком/вопросы/1227283/   -  person jgauffin    schedule 22.09.2010
comment
Термин «генератор» используется на других языках — см. вопросы/38274727/c-sharp-generator-method   -  person Michael Freidgeim    schedule 06.10.2019


Ответы (1)


Итераторы — это простой способ создать последовательность элементов без необходимости самостоятельной реализации IEnumerable<T>/IEnumerator<T>. Итератор — это метод, возвращающий IEnumerable<T>, который можно перечислить в цикле foreach.

Вот простой пример:

public IEnumerable<string> GetNames()
{
    yield return "Joe";
    yield return "Jack";
    yield return "Jane";
}

foreach(string name in GetNames())
{
    Console.WriteLine(name);
}

Обратите внимание на операторы yield return: эти операторы на самом деле не возвращают значение из метода, они просто «выдвигают» следующий элемент тому, кто читает реализацию.

Когда компилятор встречает блок итератора, он фактически перезаписывает его в конечный автомат в классе, который реализует IEnumerable<T> и IEnumerator<T>. Каждый оператор yield return в итераторе соответствует состоянию в этом конечном автомате.

Дополнительные сведения об итераторах см. в этой статье Джона Скита.

person Thomas Levesque    schedule 22.09.2010
comment
Было бы полезно увидеть пример того, когда вам может понадобиться это сделать. Ваш простой пример здесь можно было бы просто заменить массивом строк, если цель состоит в том, чтобы просто разрешить перечисление Джо, Джека и Джейн? - person MarkJ; 16.02.2011
comment
Да, этот пример не очень полезен, вместо него вы можете легко использовать массив. Дополнительные полезные примеры см. в серии статей Джона Скита о повторной реализации Linq to Objects ;) - person Thomas Levesque; 16.02.2011