Yield return Flashcards
Какой интерфейс должен быть реализован, чтобы тип можно было использовать в foreach?
IEnumerable< T >
Какие методы содержит IEnumerator< T >? Что делает каждый из них?
void Reset(); Позиционирует Enumerator на начало коллекции T Current {get;} Возвращает значение текущего элемента bool MoveNext(); Сдвигается на следующий элемент. Если получилось, то возвращает true. Иначе — false. Есть ещё object Current {get;} и Dispose()
Что делает foreach?
Получает Enumerator Вызывает MoveNext у него Если вернулось false, то перебор закончен Если вернулось true, то получает Current и возвращает его, а затем переходит на шаг 2. (На самом деле в конце итерирования ещё и вызывает метод Dispose)
Что делает yield return?
Создает прерываемый метод, возвращающий последовательность значений. Каждое значение, которое передается в yield return станет элементом последовательности.
Что делает yield break?
Используется в прерываемом методе, чтобы закончить последовательность и выйти из метода.
В чем преимущество ленивых коллекций?
Элементы вычисляются по запросу. Последовательность не хранится полностью в памяти.
Что означает термин “ленивость” по отношению к методу, принимающему и возвращающему IEnumerable?
Метод отложит получение элементов из входной коллекции до тех пор, пока они не понадобятся для вычисления очередного элемента результирующей коллекции. Как правило ленивые методы реализуются с помощью yield return или с помощью комбинирования других ленивых методов.
Как можно реализовать бесконечный IEnumerable?
Бесконечным циклом с yield return внутри
Можно ли реализовать IEnumerable, который будет возвращать разные значений при каждом новом его перечислении?
Да, например циклом, внутри которого yield return, возвращающий случайные значения.
Можно ли получить количество элементов IEnumerable не перечисляя его весь?
В общем случае нет. Но многие коллекции, реализующие IEnumerable, содержат ещё и свойство Count.