Skip to content

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)

predicatetrue を返す最初の要素を返します。条件を満たす要素がない場合は defaultValue を返します。

オーバーロードの使い分け

オーバーロード用途
既定値なし型の既定値(null0 など)で十分な場合
既定値指定空の場合に特定の値を返したい場合
条件あり条件を満たす最初の要素を取得し、見つからない場合に既定値を返したい場合

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

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

ソースシーケンスに要素がある場合は最初の要素が返されます。シーケンスが空のまま完了した場合は既定値が Task の結果として返されます。

4. サンプルコード

csharp
// 最初の要素を取得
var source = new[] { 10, 20, 30 }.ToObservable();

int? first = await source.FirstOrDefaultAsync();
Console.WriteLine(first); // 10
csharp
// 条件を満たす最初の要素を取得
var source = new[] { 10, 15, 20, 25 }.ToObservable();

int first = await source.FirstOrDefaultAsync(x => x > 18);
Console.WriteLine(first); // 20
csharp
// 空のシーケンスに対して型の既定値が返る
var empty = Observable.Empty<int>();

int? value = await empty.FirstOrDefaultAsync();
Console.WriteLine(value); // 0
csharp
// 空の場合に指定した既定値を返す
var empty = Observable.Empty<int>();

int value = await empty.FirstOrDefaultAsync(-1);
Console.WriteLine(value); // -1
csharp
// 条件を満たす要素がない場合に指定した既定値を返す
var source = new[] { 10, 15, 20 }.ToObservable();

int value = await source.FirstOrDefaultAsync(x => x > 100, -1);
Console.WriteLine(value); // -1