SkipWhile
1. 概要
SkipWhile は、条件(predicate)が true を返す間はソースシーケンスの要素をスキップし、条件が初めて false になった時点以降のすべての要素を通過させるオペレーターです。一度スキップが終了すると、以降は条件に関係なくすべての要素が通過します。
2. シグネチャ
条件関数によるスキップ
csharp
public static Observable<T> SkipWhile<T>(
this Observable<T> source,
Func<T, Boolean> predicate)predicate が true を返す間、要素をスキップします。false が返された時点以降のすべての要素を通過させます。
csharp
// 値が 5 未満の間スキップし、5 以上になったら通過開始
source.SkipWhile(x => x < 5);インデックス付き条件関数によるスキップ
csharp
public static Observable<T> SkipWhile<T>(
this Observable<T> source,
Func<T, Int32, Boolean> predicate)条件関数の第 2 引数に 0 始まりのインデックスが渡されます。
csharp
// インデックスが 3 未満の間スキップ
source.SkipWhile((x, index) => index < 3);overload の使い分け
| overload | 使う場面 |
|---|---|
Func<T, Boolean> | 要素の値だけで判定する場合 |
Func<T, Int32, Boolean> | 要素の値とインデックスで判定する場合 |
3. マーブルダイアグラム
条件が true の間は要素がスキップされます。条件が初めて false になった要素から、以降のすべての要素が下流に通過します。一度通過が始まると、再び条件が true になっても要素は通過し続けます。
4. サンプルコード
csharp
using R3;
// 値が 5 未満の間スキップ
var values = new[] { 1, 3, 5, 8, 2, 10 };
values.ToObservable()
.SkipWhile(x => x < 5)
.Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力:
// 値: 5
// 値: 8
// 値: 2 ← 条件が再び真でも通過する
// 値: 10
// インデックス付き:最初の 2 要素をスキップ
var numbers = new[] { 10, 20, 30, 40, 50 };
numbers.ToObservable()
.SkipWhile((x, index) => index < 2)
.Subscribe(x => Console.WriteLine($"値: {x}"));
// 出力:
// 値: 30
// 値: 40
// 値: 505. 補足
SkipUntil との違い
SkipWhile: 要素の値(および任意でインデックス)に基づく条件でスキップを制御します。- SkipUntil: 外部シグナル(Observable、CancellationToken、Task など)をトリガーにしてスキップを終了します。
値ベースの判定には SkipWhile、外部イベントベースの判定には SkipUntil を使います。
TakeWhile との関係
TakeWhile と SkipWhile は対称的な関係にあります。
| オペレーター | 条件が真の間 | 条件が偽になった後 |
|---|---|---|
| TakeWhile | 通過させる | 完了(以降破棄) |
SkipWhile | スキップする | 通過させる |
csharp
var values = new[] { 1, 3, 5, 8, 2, 10 };
// TakeWhile: x < 5 の間取得(5 で打ち切り)
source.TakeWhile(x => x < 5); // → 1, 3
// SkipWhile: x < 5 の間スキップ(5 から通過開始)
source.SkipWhile(x => x < 5); // → 5, 8, 2, 10