MaxByAsync
1. 概要
MaxByAsync は、指定されたキーセレクターによって最大のキー値を持つ要素そのものを選び、その結果を Task<T> として返すオペレーターです。MaxAsync がキーの最大値を返すのに対し、MaxByAsync はキーが最大である元の要素全体を返します。シーケンスが空の場合は InvalidOperationException をスローします。
2. シグネチャ
デフォルト比較によるキー最大要素の取得
csharp
public static Task<T> MaxByAsync<T, TKey>(
this Observable<T> source,
Func<T, TKey> keySelector,
CancellationToken cancellationToken = default)keySelector で抽出したキーのデフォルト比較順序に基づき、最大キーを持つ要素を返します。
カスタム比較子によるキー最大要素の取得
csharp
public static Task<T> MaxByAsync<T, TKey>(
this Observable<T> source,
Func<T, TKey> keySelector,
IComparer<TKey> comparer,
CancellationToken cancellationToken = default)カスタムの IComparer<TKey> を指定して、キーの比較ロジックを変更できます。
オーバーロードの使い分け
| オーバーロード | 用途 |
|---|---|
MaxByAsync(source, keySelector) | キーがデフォルトの順序で比較可能な場合 |
MaxByAsync(source, keySelector, comparer) | カスタム比較ロジックを使いたい場合 |
3. マーブルダイアグラム
シーケンスの各要素からキーを抽出し、最大キーを持つ要素そのものを完了時に出力します。
4. サンプルコード
csharp
// スコアが最大の学生を取得
var students = new[]
{
new { Name = "田中", Score = 85 },
new { Name = "鈴木", Score = 92 },
new { Name = "佐藤", Score = 78 },
};
var topStudent = await students.ToObservable()
.MaxByAsync(s => s.Score);
Console.WriteLine($"{topStudent.Name}: {topStudent.Score}");
// 鈴木: 92csharp
// カスタム比較子を使用して文字列長が最大の要素を取得
var words = new[] { "apple", "hi", "watermelon", "cat" };
var comparer = Comparer<int>.Default;
var longestWord = await words.ToObservable()
.MaxByAsync(w => w.Length, comparer);
Console.WriteLine(longestWord); // watermelon