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. マーブルダイアグラム
ソースシーケンスのすべての要素(●)は破棄され、完了(|)またはエラー(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("すべてのタスクが完了"));