Skip to content

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. マーブルダイアグラム

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

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

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}");
// 鈴木: 92
csharp
// カスタム比較子を使用して文字列長が最大の要素を取得
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