かずきのBlog@hatena

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

Reactive Extensions入門 3「Where」

Reactive Extensionsを使ってHello worldを書いてきました。これだけだと、ただのObserverパターンだし、イベントと比べて何が嬉しいかわからないですが、こいつにWhereなどのLINQでお馴染みのメソッドを使ってフィルタリングをかけたりすることが出来ます。


ちょっと嬉しくなるかな。ということで、サンプルです。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var subject = new Subject<int>();

        // subjectから発行された値が3じゃないとSubscribeしている
        // IObserverに通知しないフィルタを仕掛ける
        subject.Where(i => i == 3)
            .Subscribe(i =>
                Console.WriteLine("OnNext : " + i));

        // 1, 2, 3を発行しても3しかコンソールに出力されない
        subject.OnNext(1);
        subject.OnNext(2);
        subject.OnNext(3);
    }
}

実行結果は、以下のようになります。

OnNext : 3

1と2をOnNextで発行していますが、WhereでフィルタリングされたSubscribeしている所まで到達しません。こんな風にLINQでお馴染みのメソッドを使ってObserverパターンに便利な機能が色々追加されています。