В настоящее время я изучаю F #, и мне очень нравится оператор yield!
(yield-bang). Не только для его названия, но и для того, что он делает, конечно.
Оператор yield!
в принципе позволяет вам вывести все элементы последовательности из выражения последовательности. Это полезно для составления счетчиков. Поскольку я регулярно сталкиваюсь с большими сложными счетчиками, меня интересуют стратегии, которые мы можем использовать, чтобы разбить их и составить их из более простых счетчиков.
К сожалению, оператор yield!
недоступен в С#. Насколько я понимаю, то, что он делает, похоже на foreach (var x in source) yield x;
, но книга, которую я читаю (Petricek Real World F # - Manning) предлагает что он имеет лучшую производительность...
- Итак, что именно делает компилятор F # здесь? (Да, я могу посмотреть на него, используя Reflector, но я хотел бы получить более подробное описание механизма).
Чтобы получить аналогичную конструкцию в С#, я исследовал несколько способов, но ни один из них не столь краток, как оператор 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()
реализуется так, как я изложил выше.
Любые другие варианты?