Skip to content

SkipLast

1. 概要

SkipLast は、ソースシーケンスの末尾から指定した個数または指定した時間分の要素をスキップし、残りの要素を通過させるオペレーターです。末尾の不要なデータを除外したい場合に使用します。

2. シグネチャ

個数指定

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

ソースシーケンスの末尾から count 個の要素を除外します。要素をバッファリングし、count 個分だけ遅延して発行することで実現されます。

csharp
// 末尾の 3 個をスキップ
source.SkipLast(3);

時間指定

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

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

csharp
// 末尾の 5 秒間に発行された要素をスキップ
source.SkipLast(TimeSpan.FromSeconds(5));

時間指定(TimeProvider)

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

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

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

overload の使い分け

overload使う場面
Int32 count末尾から除外する要素数が決まっている場合
TimeSpan duration末尾の時間範囲で除外したい場合
TimeSpan + TimeProviderテスト可能な時間指定が必要な場合

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

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

個数指定の場合、内部で count 個分のバッファを保持し、新しい要素が入るたびに最も古い要素を押し出す形で発行します。結果として末尾の count 個が除外されます。

4. サンプルコード

csharp
using R3;

// 個数指定:末尾 3 個をスキップ
var source = Observable.Range(1, 10);

source
    .SkipLast(3)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        () => Console.WriteLine("完了"));
// 出力:
// 値: 1
// 値: 2
// 値: 3
// 値: 4
// 値: 5
// 値: 6
// 値: 7
// 完了

// 時間指定と組み合わせた例
Observable.Interval(TimeSpan.FromMilliseconds(200))
    .Take(10)
    .SkipLast(TimeSpan.FromSeconds(1))
    .Subscribe(x => Console.WriteLine($"値: {x}"));

5. 補足

TakeLast との関係

TakeLastSkipLast は対称的な関係にあります。

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

個数指定の動作の仕組み

SkipLast(count) は、内部でサイズ count のキューを保持します。要素を受信するたびにキューに追加し、キューが count を超えた場合に最も古い要素を下流に発行します。この仕組みにより、ソースの完了を待たずに要素を発行でき、count 個分の遅延が生じます。