Skip to content

LastAsync

1. 概要

LastAsync は、Observable シーケンスの最後の要素、または条件を満たす最後の要素を取り出し、その結果を Task<T> として返すオペレーターです。シーケンスが OnCompleted を発行するまで待機し、受信した最後の対象要素を結果として返します。該当する要素がないままシーケンスが完了した場合は InvalidOperationException をスローします。

2. シグネチャ

最後の要素を取得

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

シーケンスの最後の要素を返します。結果を確定するためにシーケンスの完了まで待機する必要があります。シーケンスが空の場合は例外をスローします。

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

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

predicatetrue を返す最後の要素を返します。条件を満たす要素が見つかっても、それより後に別の一致要素が流れる可能性があるため、結果はシーケンス完了時に確定します。シーケンスが完了しても条件を満たす要素が見つからなかった場合は例外をスローします。

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

オーバーロード用途
条件なしシーケンスの末尾要素を取得する
条件あり条件を満たす最後の要素を取得する

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

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

ソースシーケンスの各要素を受信しながら最後の値を保持し、OnCompleted が発行された時点でその値が Task の結果として返されます。

4. サンプルコード

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

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

int last = await source.LastAsync(x => x < 23);
Console.WriteLine(last); // 20
csharp
// 空のシーケンスでは例外がスローされる
var empty = Observable.Empty<int>();

try
{
    int value = await empty.LastAsync();
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message); // シーケンスに要素がありません
}