VC#でFizzBuzz ******************* Contents: .. contents:: .. toctree:: :maxdepth: 1 for文を使った例 -------------------- まずはもっともシンプルな例 .. literalinclude:: Src/fizzbuzz.cs :language: c :linenos: ジェネレータを使った例 --------------------------- :yield return(): を使う。 .. literalinclude:: Src/fizzbuzz_gen2.cs :language: c :linenos: Pythonの内包リストっぽく書く ------------------------------------ かなり難しい。以下の理由であり、それぞれの解法を述べる。 * 標準ライブラリでは文字列の繰り返しができない * 単一文字に変換し、最後にstring.replace()する * 文字列のor(=空白のときの代理文字列)がつかえない * 三項演算子で条件分岐する。 .. literalinclude:: Src/fizzbuzz_str.cs :language: c :linenos: 三項演算子を使った例 ------------------------------ そもそも三項演算子を使うなら、以下の例で良い。。。 .. literalinclude:: Src/fizzbuzz_ternary.cs :language: c :linenos: KeyValuePairを使って条件分岐 ----------------------------------- fizzbuzzでgoogleしたところ、以下のような例を見つけた。 .. literalinclude:: Src/fizzbuzz_keypair.cs :language: c :linenos: てっきり、proc(int)はラムダ式でしか書けないと思っていたのだが、 参照したページによれば delegate(int c) という書き方ができるのですね。 delegate表記で引数のcに対する型を明記するという意味で、 delegateの方が読みやすいかもしれませんね。 Reactive Extensions ----------------------- VisualStudio2012使っているのだからRxを使いましょう。ということで以下の例。 .. literalinclude:: Src/fizzbuzz_subscribe.vc :language: c :linenos: Observable.Publish() は Connect() するまで列挙を始めないためのおまじないで、 これによって、条件分岐を定義してから列挙することが可能。 ちなみに、IEnumerableなオブジェクトは ToObservable() で 列挙オブジェクトに変換できるので、 .. literalinclude:: Src/fizzbuzz_subscribe2.vc :language: c :linenos: とすることも可能。