Ответ 1
В примере yield return
результат оценивается при каждом вызове IEnumerable.MoveNext
, тогда как в примере списка все результаты оцениваются до возвращения IEnumerable
(обратите внимание, что свойства Text
могут не оцениваться для каждого результата, поскольку может произойти кэширование и встраивание). Поэтому при yield return
вы должны получить небольшое повышение производительности при первом вызове счетчику, а затем потенциально небольшое снижение производительности при каждом последующем вызове IEnumerable.MoveNext
по мере оценки свойства.
Одна из величайших вещей в yield return
заключается в том, что вы можете возвращать бесконечные последовательности, случайные последовательности и всевозможные другие новые перечисления, которые либо были бы крайне неэффективными или вообще невозможными сделать с моделью создания списка.
Проще говоря, для возврата экземпляра List
требуется, чтобы все элементы в списке были оценены до возвращения IEnumerable
, тогда как использование yield return
позволяет вычислять каждый элемент, как это требуется потребителю IEnumerable
.