かずきのBlog@hatena

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

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のシーケンスに対して、このメソッドを呼び出すと永遠に結果が返ってこないので注意が必要です。