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