Skip to content

Skip

1. 概要

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

2. シグネチャ

個数指定

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

先頭から count 個の要素をスキップし、それ以降の要素を通過させます。

csharp
// 最初の 5 個をスキップ
source.Skip(5);

時間指定

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

シーケンス開始から duration の時間が経過するまでの要素をスキップします。

csharp
// 最初の 3 秒間の要素をスキップ
source.Skip(TimeSpan.FromSeconds(3));

時間指定(TimeProvider)

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

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

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

overload の使い分け

overload使う場面
Int32 countスキップする要素の個数が決まっている場合
TimeSpan duration時間でスキップ範囲を指定したい場合
TimeSpan + TimeProviderテスト可能な時間指定が必要な場合

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

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

先頭から指定個数(または指定時間分)の要素が破棄され、それ以降の要素が下流に通過します。

4. サンプルコード

csharp
using R3;

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

source
    .Skip(3)
    .Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力:
// 値: 4
// 値: 5
// 値: 6
// 値: 7
// 値: 8
// 値: 9
// 値: 10

// 時間指定:最初の 1 秒間の要素をスキップ
Observable.Interval(TimeSpan.FromMilliseconds(300))
    .Skip(TimeSpan.FromSeconds(1))
    .Take(5)
    .Subscribe(x => Console.WriteLine($"値: {x}"));

5. 補足

Take との関係

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

オペレーター動作
Take(3)先頭 3 個を残す
Skip(3)先頭 3 個を除外する

TakeSkip を組み合わせると、シーケンスの特定の範囲を取得できます。

csharp
// 4 番目から 6 番目の要素を取得(0 始まりで index 3~5)
source.Skip(3).Take(3);