Skip to content

Take

1. 概要

Take は、ソースシーケンスの先頭から指定した個数または指定した時間分の要素のみを取得するオペレーターです。必要な数の要素を取得した後、シーケンスを自動的に完了させます。

2. シグネチャ

個数指定

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

先頭から count 個の要素を取得した後、OnCompleted を発行してシーケンスを完了します。

csharp
// 最初の 5 個だけ取得
source.Take(5);

時間指定

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

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

csharp
// 最初の 3 秒間の要素だけ取得
source.Take(TimeSpan.FromSeconds(3));

時間指定(TimeProvider)

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

指定した TimeProvider を使用して時間を計測します。テスト時に FakeTimeProvider を使う場合などに便利です。

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

overload の使い分け

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

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

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

個数指定の場合、先頭から指定個数の要素が通過した時点で完了(|)を発行します。時間指定の場合、指定時間内に発行された要素のみが通過します。

4. サンプルコード

csharp
using R3;

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

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

// 時間指定:最初の 2 秒間の要素を取得
Observable.Interval(TimeSpan.FromMilliseconds(500))
    .Take(TimeSpan.FromSeconds(2))
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        () => Console.WriteLine("完了"));
// 出力(おおよそ):
// 値: 0
// 値: 1
// 値: 2
// 値: 3
// 完了

5. 補足

関連オペレーターとの違い

オペレーター動作
Take先頭から N 個 / N 秒間の要素を取得
Skip先頭から N 個 / N 秒間の要素をスキップ(Take の逆)
TakeUntil外部シグナルや条件が満たされるまで要素を取得
TakeWhile条件が真の間、要素を取得(条件が偽になった時点で完了)
TakeLastシーケンス末尾から N 個 / N 秒間の要素を取得