8

我有一个SortedDictionary如何找到与最大值关联的键?我是否必须遍历每个 KeyValuePair?

4

5 回答 5

4

如果dict是 your SortedDictionary<,>(或 any IDictionary<,>)并且您想要与最大值对应的所有dict键,请首先检查它不为 null 或为空(您至少需要一个元素)。那么也许这有效:

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()然后访问返回的Key属性,First()如下所示:

 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 按 Key 排序,而不是按 Value。所以要做你想做的事,你会用老式的 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;

这只需要迭代一次数据,而不是对值进行排序并获取第一个结果(将是O(n * log(n)))。

由于只对键而不是值进行排序,因此如果不至少循环每个键对一次,就无法执行此查询。

另一种选择是拥有两个 SortedDictionaries。一个是你已经拥有的,另一个是反向字典。对于当前字典中的每个值,您可以将其作为键添加到第二个字典,第二个字典的值将是第一个字典中的键(如果它是一对多关系而不是一对一的值反向查找需要是项目列表)。虽然创建第二个字典会以编程方式“昂贵”(在内存中比在时间上更多,但仍然是两者中的一些),但一旦您这样做,您将能够基于值而不是键有效地查询。

于 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 回答