かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Reactive Extensions入門 4「Observableを作成する便利なメソッド」

さて、これまでIObservableを実装したり、便利なSubjectを使ってきたりしましたが、IObservableを作成するための便利なファクトリクラスがReactive Extensionsにはあります。名前はObservableです。LINQのEnumerableと同じような感じでとりあえず使うことが出来ます。


全部は無理なので、簡単でとっつきやすいものから試してみたいと思います。

Returnメソッド

渡した値をIQueryableにして返してくれます。単一の値をReactive Extensionsの中に組み込みたいときとかに使えそうです。

Observable.Return(1).Subscribe(
    i => Console.WriteLine(i),
    () => Console.WriteLine("Completed"));

実行結果

1
Completed

Rangeメソッド

Enumerableとまったく同じです。第一引数に指定した値から1ずつ増やした値を第二引数で指定した数だけ返してくれます。

Observable.Range(10, 3).Subscribe(
    i => Console.WriteLine(i),
    () => Console.WriteLine("Completed"));

実行結果

10
11
12
Completed

Repeatメソッド

第一引数で指定した値を第二引数で指定した回数だけ返してくれます。

Observable.Repeat(10, 3).Subscribe(
    i => Console.WriteLine(i),
    () => Console.WriteLine("Completed"));

実行結果

10
10
10
Completed

Startメソッド

引数でわたしたデリゲートが返した値を返します。

Observable.Start(() =>
    {
        Thread.Sleep(3000);
        return 10;
    }).Subscribe(
    i => Console.WriteLine(i),
    () => Console.WriteLine("Completed"));
Console.ReadKey();

実行結果

10  <-実際は10と表示されるまで3秒かかります
Completed

Generateメソッド

ソース、継続する間の条件、イテレーションセレクターを設定します。下記の例だと、初期値0 値が10より小さい間繰り返して 値は1ずつ増やして 値を2乗したものを返すといった感じになります。

Observable.Generate(0,
    i => i < 10,
    i => i + 1,
    i => i * i).Subscribe(
    i => Console.WriteLine(i),
    () => Console.WriteLine("Completed"));

実行結果

0
1
4
9
16
25
36
49
64
81
Completed

Throwメソッド

例外を投げます。Subscribeで3つのデリゲートを受け取るオーバーライドだと例外時の処理を書いたり出来ます。

Observable.Throw<int>(new Exception("例外"))
    .Subscribe(
    i => Console.WriteLine(i),
    ex => Console.WriteLine(ex.Message),
    () => Console.WriteLine("Completed"));

実行結果

例外