Skip to content

TakeLast

1. 概要

TakeLast は、ソースシーケンスの末尾から指定した個数または指定した時間分の要素のみを取得するオペレーターです。ソースが完了した後に、バッファリングしていた末尾の要素をまとめて発行します。

2. シグネチャ

個数指定

csharp
public static Observable<T> TakeLast<T>(
    this Observable<T> source,
    Int32 count)

ソースシーケンスの末尾から count 個の要素を取得します。ソースが完了するまでバッファリングし、完了後に末尾の要素を発行します。

csharp
// 最後の 3 個の要素を取得
source.TakeLast(3);

時間指定

csharp
public static Observable<T> TakeLast<T>(
    this Observable<T> source,
    TimeSpan duration)

ソースシーケンスの完了時点から遡って duration の時間内に発行された要素を取得します。

csharp
// 最後の 5 秒間に発行された要素を取得
source.TakeLast(TimeSpan.FromSeconds(5));

時間指定(TimeProvider)

csharp
public static Observable<T> TakeLast<T>(
    this Observable<T> source,
    TimeSpan duration,
    TimeProvider timeProvider)

指定した TimeProvider を使用して時間を計測します。

csharp
// テスト用の TimeProvider を使用
source.TakeLast(TimeSpan.FromSeconds(5), fakeTimeProvider);

overload の使い分け

overload使う場面
Int32 count末尾の要素数で指定したい場合
TimeSpan duration末尾の時間範囲で指定したい場合
TimeSpan + TimeProviderテスト可能な時間制限が必要な場合

3. マーブルダイアグラム

TakeLast のマーブルダイアグラム

ソースが完了するまで要素をバッファリングし、完了後に末尾の指定個数(または指定時間分)の要素をまとめて発行します。ソースが完了するまで下流には何も流れません。

4. サンプルコード

csharp
using R3;

// 個数指定:末尾の 3 個を取得
var source = Observable.Range(1, 10);

source
    .TakeLast(3)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        () => Console.WriteLine("完了"));
// 出力:
// 値: 8
// 値: 9
// 値: 10
// 完了

// 時間指定:最後の 1 秒間の要素を取得
Observable.Interval(TimeSpan.FromMilliseconds(300))
    .Take(10)  // 10 個で完了させる
    .TakeLast(TimeSpan.FromSeconds(1))
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        () => Console.WriteLine("完了"));

5. 補足

SkipLast との関係

SkipLastTakeLast の逆で、末尾の N 個(または N 秒間)の要素をスキップします。

オペレーター動作
TakeLast(3)末尾 3 個を残す
SkipLast(3)末尾 3 個を除外する

注意点

TakeLast はソースが完了するまで内部でバッファリングを行います。無限シーケンスに対して使用するとソースが完了しないため、要素が一切発行されません。無限シーケンスには Take を使用してください。