8

SortedDictionary最大値に関連付けられたキーを見つけるにはどうすればよいですか? すべての KeyValuePair をループする必要がありますか?

4

5 に答える 5

4

dictがあなたの(SortedDictionary<,>または任意のIDictionary<,>) であり、最大値に対応するすべてdictのキーが必要な場合は、最初にが null または空でないことを確認します (少なくとも 1 つの要素が必要です)。次に、これが機能する可能性があります。

var max = dict.Values.Max();
var relevantKeys = dict.Where(pair => max.Equals(pair.Value))
    .Select(pair => pair.Key);

もっと効率的にできるのではないでしょうか?

于 2012-07-18T20:48:20.657 に答える
2

次のように戻り値のプロパティを使用Enumerable.OrderByDescending()してアクセスします。KeyFirst()

 var dict = new SortedDictionary<string, string>
                       {
                           {"key1", "value3"},
                           {"key2", "value1"},
                           {"key3", "value2"},
                       };

        var max = dict.OrderByDescending(d => d.Value).First();
        var key = max.Key;
于 2012-07-18T20:24:27.560 に答える
1

最大値に関連付けられたキーを取得するということは、SortedDictionary のデフォルトの順序付けを実際に使用していないことを意味します。これは、SortedDictionar が値ではなくキーで注文するためです。したがって、やりたいことを行うには、昔ながらの LINQ の方法で行います。

sortedDict.OrderByDescending(kvp => kvp.Value).First().Key
于 2012-07-18T20:26:18.800 に答える
1

MoreLinqのMaxByメソッドを使用して、このクエリを効率的に実行できます。

var result =  dictionary.MaxBy(pair => pair.Value).Key;

これは、値を並べ替えて最初の結果 ( になります) を取得するのではなく、データを 1 回反復するだけで済みますO(n * log(n))

値ではなくキーのみがソートされるため、少なくともすべてのキーペアを 1 回ループせずにこのクエリを実行する方法はありません。

もう 1 つのオプションは、2 つの SortedDictionaries を持つことです。1 つは既にお持ちの辞書で、もう 1 つは逆引き辞書です。現在のディクショナリの各値について、それを 2 番目のディクショナリのキーとして追加できます。2 番目のディクショナリの値は最初のディクショナリのキーになります (1 対 1 ではなく 1 対多の関係の場合、逆引きはアイテムのリストである必要があります)。この 2 番目のディクショナリを作成するには、プログラム的に "コストがかかります" (時間よりもメモリの方が多くなりますが、それでも両方の一部です) が、一度作成すると、キーではなく値に基づいて効率的にクエリを実行できるようになります。

于 2012-07-18T20:36:17.860 に答える
0

関心のある最大値を保持するすべてのキーを取得するには、いくつかのデータ処理を行う必要があります。実際、これは C# では非常に快適です。

Linqのいくつかの組み合わせを行うことで実現できます

// first of all, group your dictionary by the value you want to have
var groups = dict.GroupBy(d => d.Value);

// then, order those groups by the value
var orderedGroups = groups.OrderBy(g => g.Key);

// after that, you have all the KeyValuePairs that hold the MaxValue here:
var maxKeys = orderedGroups.Last().ToList();

それを楽しんでください!

于 2012-07-18T20:41:48.477 に答える