1. ホーム
  2. c#

[解決済み] C#で辞書の最高値のキーを取得する良い方法

2023-06-09 04:50:40

質問

の中の最大値のキーを取得しようとしています。 Dictionary<string, double> results .

今のところ、こんな感じです。

double max = results.Max(kvp => kvp.Value);
return results.Where(kvp => kvp.Value == max).Select(kvp => kvp.Key).First();

しかし、これでは少し効率が悪いようなので、もっと良い方法はないかと考えていました。

どのように解決するのですか?

標準的なLINQを使った、最も読みやすいO(n)の答えだと思います。

var max = results.Aggregate((l, r) => l.Value > r.Value ? l : r).Key;

edit: CoffeeAddictに関する説明

Aggregate は、一般的に知られている関数型コンセプトのLINQ名である 折りたたみ

セットの各要素をループして、指定した関数を適用します。 ここでは、大きい方の値を返す比較関数を指定しています。 ループしている間 Aggregate は前回私の関数を呼び出したときの結果を記憶している。これは比較関数に変数 l . この変数 r は現在選択されている要素である。

つまり、aggregateがセット全体をループした後、最後に私の比較関数を呼び出したときの結果を返します。次に .Key メンバを読み取ります。それは辞書のエントリであることが分かっているからです。

これは別の見方です(これがコンパイルできることを保証するものではありません)。

var l = results[0];
for(int i=1; i<results.Count(); ++i)
{
    var r = results[i];
    if(r.Value > l.Value)
        l = r;        
}
var max = l.Key;