かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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"));

実行結果

例外