TakeWhile
1. 概要
TakeWhile は、条件(predicate)が true を返す間、ソースシーケンスの要素を取得し続けるオペレーターです。条件が初めて false になった時点でシーケンスを完了させます。その要素以降はすべて破棄されます。
2. シグネチャ
条件関数による取得
csharp
public static Observable<T> TakeWhile<T>(
this Observable<T> source,
Func<T, Boolean> predicate)predicate が true を返す間、要素を通過させます。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. マーブルダイアグラム
条件が 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
// 値: 35. 補足
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, 12SkipWhile との関係
SkipWhile は TakeWhile の逆で、条件が true の間は要素をスキップし、条件が false になった時点以降の要素を通過させます。
| オペレーター | 条件が真の間 | 条件が偽になった後 |
|---|---|---|
TakeWhile | 通過させる | 完了 |
| SkipWhile | スキップする | 通過させる |