我有一个SortedDictionary
如何找到与最大值关联的键?我是否必须遍历每个 KeyValuePair?
5 回答
如果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);
也许它可以更有效地完成?
使用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;
获取与最大值关联的键,意味着您实际上并未使用 SortedDictionary 的默认排序。这是因为 SortedDictionar 按 Key 排序,而不是按 Value。所以要做你想做的事,你会用老式的 LINQ 方式来做:
sortedDict.OrderByDescending(kvp => kvp.Value).First().Key
您可以使用 MoreLinq 中的MaxBy方法来有效地运行此查询。
var result = dictionary.MaxBy(pair => pair.Value).Key;
这只需要迭代一次数据,而不是对值进行排序并获取第一个结果(将是O(n * log(n))
)。
由于只对键而不是值进行排序,因此如果不至少循环每个键对一次,就无法执行此查询。
另一种选择是拥有两个 SortedDictionaries。一个是你已经拥有的,另一个是反向字典。对于当前字典中的每个值,您可以将其作为键添加到第二个字典,第二个字典的值将是第一个字典中的键(如果它是一对多关系而不是一对一的值反向查找需要是项目列表)。虽然创建第二个字典会以编程方式“昂贵”(在内存中比在时间上更多,但仍然是两者中的一些),但一旦您这样做,您将能够基于值而不是键有效地查询。
要获得所有保留您感兴趣的最大值的键,必须进行一些数据处理。实际上这在 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();
玩得开心!