Skip to content

AnyAsync

1. 概要

AnyAsync は、Observable シーケンスに要素が存在するか、または条件を満たす要素が存在するかを判定し、その結果を Task<Boolean> として返すオペレーターです。述語なしのオーバーロードはシーケンスが空でないかを判定し、述語ありのオーバーロードは条件に一致する要素が見つかった時点で true を返して短絡評価します。

2. シグネチャ

要素の存在判定(述語なし)

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

シーケンスに 1 つ以上の要素が存在する場合に true を返します。最初の要素を受信した時点で即座に true を返し、購読を解除します。シーケンスが空のまま完了した場合は false を返します。

述語による条件判定

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

predicate を満たす要素が 1 つでも存在する場合に true を返します。条件に一致する要素が見つかった時点で短絡評価を行います。

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

オーバーロード用途
述語なしシーケンスが空でないことを確認したい場合
述語あり特定の条件を満たす要素が存在するかを確認したい場合

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

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

述語なしの場合は最初の要素を受信した時点で true が返されます。述語ありの場合は条件に一致する要素が見つかった時点で true が返され、見つからないまま完了すると false が返されます。

4. サンプルコード

csharp
// シーケンスに要素が存在するか
var source = new[] { 1, 2, 3 }.ToObservable();

bool hasAny = await source.AnyAsync();
Console.WriteLine(hasAny); // True
csharp
// 空のシーケンス
var empty = Observable.Empty<int>();

bool hasAny = await empty.AnyAsync();
Console.WriteLine(hasAny); // False
csharp
// 述語を使用:偶数が含まれるか
var source = new[] { 1, 3, 5, 4, 7 }.ToObservable();

bool hasEven = await source.AnyAsync(x => x % 2 == 0);
Console.WriteLine(hasEven); // True(4 の時点で判定終了)

5. 補足

  • AllAsync と対になるオペレーターです。AnyAsyncいずれかの要素 が条件を満たすかを判定し、AllAsyncすべての要素 が条件を満たすかを判定します。
  • 述語なしの AnyAsyncIsEmptyAsync の論理否定に相当します。await AnyAsync()!(await IsEmptyAsync()) と等価です。