10.12/24Twitter上で見たお題、10個コンソールから整数の入力を受けて最少と最大を出す。Linqで書くならこうでしょうか。通常は0-10でfor文を回すところはRangeで。あとはMinとMax。int.Parseなので数字以外は例外飛んでしまいますが、その辺は無視で。input.Min();はい。これだと20回入力させることになってしまいます。Maxで列挙され、Minでも列挙され。いうわけで、配列に一度保存しますか。input.Min();よろしい。これの列挙回数は3回です。ToArrayで一度、Maxで一度、Minで一度。MaxとMinを出したいだけなのに、わざわざ配列に保存してしまっています。配列が巨大になる場合はメモリ的な意味でもちょっと嫌ですねえ。Extensions。プッシュ型ならば分配が可能です。.Subscribe(Console.WriteLine);ふむ、これはクールだ......。Rxの格好良さは異常。Publishは今までにも何度も出してきましたが、シーケンスを分配するメソッドです。今までは引数なしにして、IConnectableObservableを変数に受けて、それに対してポコポコ足して、最後にConnect。していましたが、Publishには引数有り版も用意されています。引数有りの場合は分配されたIObservableが変数として渡ってくるわけです。input.Connect();と等しいということになります。.Subscribe();といったような書き方も可能ですね。min,max,sum,avgと4つを返したい場合はどうしよう。Join-And-Thenを使います。.Subscribe(Console.WriteLine);この例だと単純に直列に繋いでいるだけなので、Zipと同じようにAndで繋いでThen。ゴチャッとしていますが。Joinの強力なところはAnd-Thenで作るPlan(Thenの戻り値)を複数受けられるという点にあります。これにより複雑な結合を生成する事ができます。ZipとMergeが混ざったような、でももう少し複雑な何か。PublishPublishはオーバーロードが8つもあって最初戸惑ってしまいますが、分類としては二つに分けられます(そしてそれぞれFuncを受け取る/スケジューラを受け取るの組み合わせで4つに分かれて2×4=8のオーバーロード)。一つは引数として初期値を受け取らないもの。今までは全部、受け取らないものを見てきました。内部的にはSubjectを使って分配しています。初期値を受け取るものは内部的にBehaviorSubjectを使って分配します。注意しないといけないのは、ふつーのシーケンスがあって、それをRxで分配やるとはっきし言って遅いです。列挙数が多くなると、ただ配列舐めるのに比べて数万倍のパフォーマンス差が出たりします。ほとんどのシチュエーションでRxで分配するぐらいなら二度三度舐めたほうが速いです。分配に限らずRxが普通に遅いということなのですがー。今回の例のConsole.ReadLineで、というのは、当然Rxのほうが速いですが。入力とリアルタイムに応答していますからね。Reactive!ようするところ、Rxが活きるのってそういうところ、かしらん。