Skip to content

IgnoreElements

1. 概要

IgnoreElements は、ソースシーケンスのすべての要素を無視し、完了(OnCompleted)またはエラー(OnErrorResume)の通知のみを下流に伝えるオペレーターです。シーケンスの「完了」だけに関心がある場合に使用します。副作用付きのオーバーロードでは、要素を無視しつつ各要素に対してアクションを実行できます。

2. シグネチャ

すべての要素を無視

csharp
public static Observable<T> IgnoreElements<T>(
    this Observable<T> source)

すべての OnNext 通知を破棄し、OnCompleted と OnErrorResume のみを通過させます。

csharp
// 完了だけを検知する
source.IgnoreElements();

副作用付きですべての要素を無視

csharp
public static Observable<T> IgnoreElements<T>(
    this Observable<T> source,
    Action<T> doOnNext)

各要素に対して doOnNext アクションを実行しつつ、OnNext 通知自体は下流に流しません。ログ記録や外部状態の更新など、副作用だけが必要な場合に便利です。

csharp
// 要素をログに記録しつつ、下流には完了のみ通知
source.IgnoreElements(x => Logger.Log($"処理: {x}"));

overload の使い分け

overload使う場面
引数なし完了・エラー通知だけが必要な場合
Action<T> doOnNext各要素に副作用を実行しつつ、下流には完了のみ通知したい場合

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

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

ソースシーケンスのすべての要素(●)は破棄され、完了(|)またはエラー(X)の通知のみが下流に伝わります。

4. サンプルコード

csharp
using R3;

// 基本的な使用例:処理の完了だけを待つ
var source = Observable.Range(1, 100);

source
    .IgnoreElements()
    .Subscribe(
        x => Console.WriteLine($"値: {x}"),  // 呼ばれない
        () => Console.WriteLine("すべての処理が完了しました"));
// 出力:
// すべての処理が完了しました

// 副作用付き:要素をログに記録しつつ完了だけ通知
var items = new[] { "A", "B", "C" };

items.ToObservable()
    .IgnoreElements(x => Console.WriteLine($"[ログ] 処理中: {x}"))
    .Subscribe(
        _ => { },
        () => Console.WriteLine("完了"));
// 出力:
// [ログ] 処理中: A
// [ログ] 処理中: B
// [ログ] 処理中: C
// 完了

// 複数のソースの完了を待ち合わせる例
var task1 = source1.IgnoreElements();
var task2 = source2.IgnoreElements();

Observable.Merge(task1, task2)
    .Subscribe(
        _ => { },
        () => Console.WriteLine("すべてのタスクが完了"));