私は現在 F# を学んでおり、yield!
(yield-bang) 演算子が大好きです。その名前だけでなく、もちろんそれが何をするかについても。
演算子を使用すると、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()
上記で概説した方法で実装されているため、これは前述のソリューションと変わらないと思います。
他のオプションはありますか?