Я сейчас изучаю F #, и мне действительно нравится оператор yield!
(yield-bang).Конечно, не только для его имени, но и для того, что он делает.
Оператор yield!
в основном позволяет вам получить все элементы последовательности из выражения последовательности.Это полезно для составления перечислителей.Поскольку я регулярно сталкиваюсь с большими и сложными перечислителями, меня интересуют стратегии, которые мы можем использовать, чтобы разбить их и составить из более простых перечислителей.
К сожалению, оператор yield!
недоступен в C #.Насколько я понимаю, это похоже на foreach (var x in source) yield x;
, но книга, которую я читаю ( Реальный мир Петричека F # - Мэннинг ), предполагает, что он имеет лучшую производительность ...
- Так что же здесь делает компилятор F #?(Да, я тоже могу посмотреть на него с помощью Reflector, но мне бы хотелось иметь более подробное описание механизма).
Чтобы достичь аналогичной конструкции в C #, я исследовал несколько способов, но ни один из них не является таким кратким, как оператор yield!
, и я также не уверен в их сложности.Может ли кто-нибудь предоставить ввод, если мои цифры BigO верны?
Разложить перечислитель на несколько частных перечислителей, а затем вывести каждый элемент из открытого перечислителя:
foreach (var x in part1()) yield x
foreach (var x in part2()) yield x
Thisэффективно приведет к «двойной доходности» на каждом элементе.Это O (2n) тогда?(или, возможно, хуже?) В любом случае, использование этого подхода мешает мне использовать yield break;
из любой из моих частей.
Разложить перечислитель на несколько частных перечислителей, а затем объединить все частные перечислители изpublic enumerator:
return part1().Concat(part2())
Полагаю, это ничем не отличается от вышеупомянутого решения, поскольку Concat()
реализован так, как я обрисовал выше.
Есть еще варианты?