Skip to content

TakeWhile

1. 概要

TakeWhile は、条件(predicate)が true を返す間、ソースシーケンスの要素を取得し続けるオペレーターです。条件が初めて false になった時点でシーケンスを完了させます。その要素以降はすべて破棄されます。

2. シグネチャ

条件関数による取得

csharp
public static Observable<T> TakeWhile<T>(
    this Observable<T> source,
    Func<T, Boolean> predicate)

predicatetrue を返す間、要素を通過させます。false が返された時点でシーケンスを完了します。

csharp
// 値が正の間だけ取得
source.TakeWhile(x => x > 0);

インデックス付き条件関数による取得

csharp
public static Observable<T> TakeWhile<T>(
    this Observable<T> source,
    Func<T, Int32, Boolean> predicate)

条件関数の第 2 引数に 0 始まりのインデックスが渡されます。

csharp
// インデックスが 5 未満かつ値が正の間取得
source.TakeWhile((x, index) => index < 5 && x > 0);

overload の使い分け

overload使う場面
Func<T, Boolean>要素の値だけで判定する場合
Func<T, Int32, Boolean>要素の値とインデックスで判定する場合

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

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

条件が true の間は要素がそのまま通過します。条件が初めて false になった時点でシーケンスが完了(|)し、それ以降の要素はすべて破棄されます。

4. サンプルコード

csharp
using R3;

// 値が 10 未満の間取得
var values = new[] { 2, 4, 6, 8, 12, 3, 1 };

values.ToObservable()
    .TakeWhile(x => x < 10)
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),
        () => Console.WriteLine("完了"));
// 出力:
// 値: 2
// 値: 4
// 値: 6
// 値: 8
// 完了

// インデックス付き:最大 3 個かつ正の値の間
var numbers = new[] { 5, 3, -1, 7, 2 };

numbers.ToObservable()
    .TakeWhile((x, index) => index < 3 && x > 0)
    .Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力:
// 値: 5
// 値: 3

5. 補足

TakeUntil との違い

  • TakeWhile(predicate): 条件が true取得します。条件が false になった要素は含まれません
  • TakeUntil(predicate): 条件が true になる要素まで取得します。条件を満たした要素が含まれます
csharp
var values = new[] { 1, 3, 5, 8, 12, 4 };

// TakeWhile: x < 10 の間(12 は含まれない)
source.TakeWhile(x => x < 10);     // → 1, 3, 5, 8

// TakeUntil: x >= 10 になるまで(12 は含まれる)
source.TakeUntil(x => x >= 10);    // → 1, 3, 5, 8, 12

SkipWhile との関係

SkipWhileTakeWhile の逆で、条件が true の間は要素をスキップし、条件が false になった時点以降の要素を通過させます。

オペレーター条件が真の間条件が偽になった後
TakeWhile通過させる完了
SkipWhileスキップする通過させる