我有一个SortedDictionary
如何找到与最大值关联的密钥?我是否必须遍历每个KeyValuePair?
答案 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();
玩得开心!