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