Skip to content

DefaultIfEmpty

1. 概要

DefaultIfEmpty は、ソース Observable が要素を 1 つも発行せずに完了した場合に、デフォルト値を発行するオペレーターです。ソースが 1 つ以上の要素を発行した場合は、そのまま変更なく通過させます。空のシーケンスに対するフォールバック値の提供に便利です。

2. シグネチャ

パラメーターなしオーバーロード

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

ソースが空の場合、default(T) を発行してから完了します。

デフォルト値指定オーバーロード

csharp
public static Observable<T> DefaultIfEmpty<T>(
    this Observable<T> source,
    T defaultValue)

ソースが空の場合、指定した defaultValue を発行してから完了します。

overload の使い分け

オーバーロード用途
パラメーターなし型のデフォルト値(default(T))で十分な場合。
デフォルト値指定特定のフォールバック値を明示的に指定したい場合。

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

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

ソースが要素を発行せずに完了した場合のみデフォルト値が挿入されます。ソースが 1 つ以上の要素を発行した場合は、何も変更されません。

4. サンプルコード

csharp
// 空のシーケンスにデフォルト値を提供
var empty = Observable.Empty<int>();

empty.DefaultIfEmpty(42)
    .Subscribe(x => Console.WriteLine(x));
// 出力: 42
csharp
// 要素がある場合はそのまま通過
var source = new Subject<int>();

source.DefaultIfEmpty(42)
    .Subscribe(x => Console.WriteLine(x));

source.OnNext(1); // 1
source.OnNext(2); // 2
source.OnCompleted();
// 42 は発行されない(ソースが空ではないため)
csharp
// パラメーターなし:default(T) が使われる
var empty = Observable.Empty<int>();

empty.DefaultIfEmpty()
    .Subscribe(x => Console.WriteLine(x));
// 出力: 0(int のデフォルト値)