かずきのBlog@hatena

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

Reactive Extensions再入門 その33「シーケンスの最後を起点にSkipとTake」

過去記事インデックス

はじめに

今回は、はるか昔「その8」や「その9」で紹介したSkipとTake系のメソッドの仲間のSkipLastとTakeLastについて紹介します。何故、前にやらなかったかというと忘れてましたはい。

SkipLastとTakeLastメソッド

ここでは、SkipLastメソッドとTakeLastメソッドについて説明します。SkipLastメソッドとTakeLastメソッドは名前が示す通りIObservableのシーケンスの最後から指定した数の値をSkipしたりTakeしたりするメソッドです。メソッドのシグネチャは下記に示す通り、どちらも何個の値をSkipするのかTakeするのかを指定する数を渡します。

public static IObservable<T> SkipLast<T>(this IObservable<T> source, int count);
public static IObservable<T> TakeLast<T>(this IObservable<T> source, int count);

SkipLastメソッドの使用例を下記に示します。

Observable
    // 1〜10の値を発行する
    .Range(1, 10)
    // 最後3つをSkip
    .SkipLast(3)
    // 購読して表示
    .Subscribe(
        i => Console.WriteLine("OnNext({0})", i),
        () => Console.WriteLine("OnCompleted()"));

このコードは、1〜10の値を発行して最後の3つの値をSkipしています。実行結果を以下に示します。8,9,10の最後の3つの値が表示されていないことが確認できます。

OnNext(1)
OnNext(2)
OnNext(3)
OnNext(4)
OnNext(5)
OnNext(6)
OnNext(7)
OnCompleted()

次にTakeLastメソッドの使用例を下記に示します。

Observable
    // 1〜10の値を発行する
    .Range(1, 10)
    // 最後3つをTake
    .TakeLast(3)
    // 購読して表示
    .Subscribe(
        i => Console.WriteLine("OnNext({0})", i),
        () => Console.WriteLine("OnCompleted()"));

このコードは、1〜10の値を発行して最後の3つを拾っています。実行結果を以下に示します。SkipLastの例では飛ばされていた8,9,10が表示されていることが確認できます。

OnNext(8)
OnNext(9)
OnNext(10)
OnCompleted()|

このように、SkipLastメソッドとTakeLastメソッドを使うことでIObservableのシーケンスの最後を起点にしてSkipしたりTakeをすることが出来ます。そのため、永遠に終わらないIObservableのシーケンスに対して、このメソッドを呼び出すと永遠に結果が返ってこないので注意が必要です。