Возвращать результат через 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``