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. マーブルダイアグラム
シーケンスの各要素からキーを抽出し、最小キーを持つ要素そのものを完了時に出力します。
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