从SortedDictionary中查找具有最大值的键?

时间:2012-07-18 20:18:35

标签: c# max sorteddictionary

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

5 个答案:

答案 0 :(得分:4)

如果dict是您的SortedDictionary<,>并且您希望所有与最大值对应的键,请先检查dict是否为空或为空(你需要至少一个元素)。那么这可能有效:

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

也许可以提高效率?

答案 1 :(得分: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;

答案 2 :(得分:1)

您可以使用MaxBy中的MoreLinq方法有效地运行此查询。

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

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

由于只对键而不是值进行排序,因此无法在没有至少遍历每个键对的情况下执行此查询。

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

答案 3 :(得分:0)

获取与max值关联的键意味着您实际上并未使用SortedDictionary的默认顺序。这是因为SortedDictionar按键排序,而不是按价值排序。所以要做你想做的事,你要用老式的LINQ方式做到:

sortedDict.OrderByDescending(kvp => kvp.Value).First().Key

答案 4 :(得分: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();

玩得开心!