Skip to content

MinByAsync

1. 概要

MinByAsync は、指定されたキーセレクターによって最小のキー値を持つ要素そのものを選び、その結果を Task<T> として返すオペレーターです。MinAsync がキーの最小値を返すのに対し、MinByAsync はキーが最小である元の要素全体を返します。シーケンスが空の場合は InvalidOperationException をスローします。

2. シグネチャ

デフォルト比較によるキー最小要素の取得

csharp
public static Task<T> MinByAsync<T, TKey>(
    this Observable<T> source,
    Func<T, TKey> keySelector,
    CancellationToken cancellationToken = default)

keySelector で抽出したキーのデフォルト比較順序に基づき、最小キーを持つ要素を返します。

カスタム比較子によるキー最小要素の取得

csharp
public static Task<T> MinByAsync<T, TKey>(
    this Observable<T> source,
    Func<T, TKey> keySelector,
    IComparer<TKey> comparer,
    CancellationToken cancellationToken = default)

カスタムの IComparer<TKey> を指定して、キーの比較ロジックを変更できます。

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

オーバーロード用途
MinByAsync(source, keySelector)キーがデフォルトの順序で比較可能な場合
MinByAsync(source, keySelector, comparer)カスタム比較ロジックを使いたい場合

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

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

シーケンスの各要素からキーを抽出し、最小キーを持つ要素そのものを完了時に出力します。

4. サンプルコード

csharp
// 価格が最小の商品を取得
var products = new[]
{
    new { Name = "商品A", Price = 1200 },
    new { Name = "商品B", Price = 800 },
    new { Name = "商品C", Price = 1500 },
};

var cheapest = await products.ToObservable()
    .MinByAsync(p => p.Price);

Console.WriteLine($"{cheapest.Name}: {cheapest.Price}円");
// 商品B: 800円
csharp
// カスタム比較子を使用して文字列長が最小の要素を取得
var words = new[] { "apple", "hi", "watermelon", "cat" };
var comparer = Comparer<int>.Default;

var shortestWord = await words.ToObservable()
    .MinByAsync(w => w.Length, comparer);

Console.WriteLine(shortestWord); // hi