Andriy Shyrokoryadov

.Net developer, data scientist

Ключевое слово yield - вопрос №11 на собеседование C# / .NET

Текст к видео "Ключевое слово yield" на канале YouTube

Ключевое слово yield появляется в контексте работы с коллекциями и перебором элементов этих коллекций. Как правило коллекции реализуют интерфейсы IEnumerable и IEnumerator, что позволяет с легкостью перебирать элементы этих коллекций с помощью оператора foreach.

Давайте подумаем какие методы должна содержать коллекция, чтобы ее элементы можно было перебирать. Для лучшего понимания давайте представим себе бочонки лото в мешке, количество бочонков в мешке нам не известно, но давайте введем условием, что там есть хотя бы один бочонок. Наша цель перебрать все бочонки в мешке. Какое будет наше первое действие? 1. Возьми бочонок. Это будет наш первый метод работы с коллекцией. Чтобы где-то записать число на бочонке, мы введем свойство «Текущий бочонок». Дополнительно можно проверять есть ли еще бочонки в мешке перед каждой пробой взять бочонок – второй метод для перебора коллекции будет 2. Проверь есть ли еще бочонки.

Если мы назовем метод «Возьми бочонок» названием «MoveNext», а метод «Проверь есть ли еще бочонки» - «HasNext», то это будет реализацией шаблона проектирования «Итератор» или «Повторение», который повсеместно используется в коллекциях. Дополнительно к нему мы реализовали свойство «Текущий бочонок», которое можно назвать более универсально – «Current».

Ключевое слово yield позволяет создавать «на лету» итератор для коллекции с методами, указанными выше. Что дает нам получение итератора? Для коллекции, которая не реализовала интерфейсы IEnumerable и IEnumerator можно с легкостью их реализовать, чтобы данную коллекцию можно было использовать в петле foreach или как аргумент в методе LINQ.