FirstOrDefaultAsync
1. 概要
FirstOrDefaultAsync は、Observable シーケンスの最初の要素、または条件を満たす最初の要素を取り出し、その結果を Task として返すオペレーターです。該当する要素がない場合は、型の既定値または指定した既定値を返します。FirstAsync と異なり、該当する要素がない場合でも例外をスローしません。
2. シグネチャ
型の既定値を使用
csharp
public static Task<T?> FirstOrDefaultAsync<T>(
this Observable<T> source,
CancellationToken cancellationToken = default)シーケンスの最初の要素を返します。シーケンスが空の場合は default(T) を返します(参照型の場合は null、値型の場合は型の既定値)。
既定値を指定
csharp
public static Task<T> FirstOrDefaultAsync<T>(
this Observable<T> source,
T defaultValue,
CancellationToken cancellationToken = default)シーケンスが空の場合に返す値を defaultValue で明示的に指定します。
条件を満たす最初の要素を取得
csharp
public static Task<T> FirstOrDefaultAsync<T>(
this Observable<T> source,
Func<T, Boolean> predicate,
T defaultValue = default,
CancellationToken cancellationToken = default)predicate が true を返す最初の要素を返します。条件を満たす要素がない場合は defaultValue を返します。
オーバーロードの使い分け
| オーバーロード | 用途 |
|---|---|
| 既定値なし | 型の既定値(null や 0 など)で十分な場合 |
| 既定値指定 | 空の場合に特定の値を返したい場合 |
| 条件あり | 条件を満たす最初の要素を取得し、見つからない場合に既定値を返したい場合 |
3. マーブルダイアグラム
ソースシーケンスに要素がある場合は最初の要素が返されます。シーケンスが空のまま完了した場合は既定値が Task の結果として返されます。
4. サンプルコード
csharp
// 最初の要素を取得
var source = new[] { 10, 20, 30 }.ToObservable();
int? first = await source.FirstOrDefaultAsync();
Console.WriteLine(first); // 10csharp
// 条件を満たす最初の要素を取得
var source = new[] { 10, 15, 20, 25 }.ToObservable();
int first = await source.FirstOrDefaultAsync(x => x > 18);
Console.WriteLine(first); // 20csharp
// 空のシーケンスに対して型の既定値が返る
var empty = Observable.Empty<int>();
int? value = await empty.FirstOrDefaultAsync();
Console.WriteLine(value); // 0csharp
// 空の場合に指定した既定値を返す
var empty = Observable.Empty<int>();
int value = await empty.FirstOrDefaultAsync(-1);
Console.WriteLine(value); // -1csharp
// 条件を満たす要素がない場合に指定した既定値を返す
var source = new[] { 10, 15, 20 }.ToObservable();
int value = await source.FirstOrDefaultAsync(x => x > 100, -1);
Console.WriteLine(value); // -1