Skip to content

SkipWhile

1. 概要

SkipWhile は、条件(predicate)が true を返す間はソースシーケンスの要素をスキップし、条件が初めて false になった時点以降のすべての要素を通過させるオペレーターです。一度スキップが終了すると、以降は条件に関係なくすべての要素が通過します。

2. シグネチャ

条件関数によるスキップ

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

predicatetrue を返す間、要素をスキップします。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. マーブルダイアグラム

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

条件が 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
// 値: 50

5. 補足

SkipUntil との違い

  • SkipWhile: 要素の値(および任意でインデックス)に基づく条件でスキップを制御します。
  • SkipUntil: 外部シグナル(Observable、CancellationToken、Task など)をトリガーにしてスキップを終了します。

値ベースの判定には SkipWhile、外部イベントベースの判定には SkipUntil を使います。

TakeWhile との関係

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

オペレーター条件が真の間条件が偽になった後
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