Skip to content

LastOrDefaultAsync

1. 概要

LastOrDefaultAsync は、Observable シーケンスの最後の要素、または条件を満たす最後の要素を取り出し、その結果を Task として返すオペレーターです。該当する要素がない場合は、型の既定値または指定した既定値を返します。LastAsync と異なり、該当する要素がない場合でも例外をスローしません。

2. シグネチャ

型の既定値を使用

csharp
public static Task<T?> LastOrDefaultAsync<T>(
    this Observable<T> source,
    CancellationToken cancellationToken = default)

シーケンスの最後の要素を返します。シーケンスが空の場合は default(T) を返します(参照型の場合は null、値型の場合は型の既定値)。

既定値を指定

csharp
public static Task<T> LastOrDefaultAsync<T>(
    this Observable<T> source,
    T defaultValue,
    CancellationToken cancellationToken = default)

シーケンスが空の場合に返す値を defaultValue で明示的に指定します。

条件を満たす最後の要素を取得

csharp
public static Task<T> LastOrDefaultAsync<T>(
    this Observable<T> source,
    Func<T, Boolean> predicate,
    T defaultValue = default,
    CancellationToken cancellationToken = default)

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

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

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

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

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

ソースシーケンスの各要素を受信しながら最後の値を保持し、OnCompleted 時にその値が返されます。シーケンスが空のまま完了した場合は既定値が Task の結果として返されます。

4. サンプルコード

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

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

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

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

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

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