Возвращать результат через yield return или обычную коллекцию

Не очень популярный вопрос на собеседовании, но если зайдет разговор, то лучше бы знать как ответить. А еще это действительно прикольный инструмент, которым нужно уметь пользоваться.

Что это вообще такое - мы можем создать бесконечный итератор, который потом будем использовать в foreach, при этом значения будут генерироваться в процессе перебора `public static IEnumerable GetNumbers() { var i = 0; while (true) { i++; yield return i; } }

Зачем это нужно? Самый простой известный пример - расчет факториала: `public static IEnumerable FactorialSequence() { long factorial = 1, n = 0; while (true) { if (n == 0) yield return 1; else { factorial *= n; yield return factorial; } n++; } }

И последнее - а если у меня обычная коллекция, которую я создаю и она конечна лучше ли использовать yield или сразу возвращать готовую коллекцию? Если сразу после вызова идет материализация CreateMySimpleBoundedCollection().ToArray() - то сразу готовую. Если потом планируем цепочку вызовов CreateMySimpleBoundedCollection().FilterByMyCondition().Take(pageSize) и особенно в этой цепочке предположительно возмем не всю коллекцию, а часть - есть смысл использовать yield

#junior``
repost

18

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь