我是lambdas的新手,在我尝试做一些更复杂的事情之前,他们看起来相当直接。 我有这本字典。
Dictionary<int, int> dict = new Dictionary<int,int>();
我希望获得具有最大值的key-val对的键。我试过的是:
dict.Keys.Max(g => dict[g])
理由是,在Keys列表中,选择dict [key]最大的那个。但是,这会选择最大的值,而不是相应的键。
答案 0 :(得分:6)
dict.Keys.OrderByDescending(g => dict[g]).First()
将完成您想要的任务,但对于大型词典可能效率低下。 John Skeet MoreLinq中的MaxBy
将完全符合您的要求。
答案 1 :(得分:1)
var maxValue = dict.Max((maxPair) => maxPair.Value);
var maxPairs = dict.Where((pair) => pair.Value == maxValue);
这将为您提供所有具有最大值的对的列表。
如果您只想要这些按键,则可以在以后执行此操作:
var maxKeys = maxPairs.Select((pair) => pair.Key);
答案 2 :(得分:1)
我决定根据我对McKay的想法添加答案。鉴于标准LINQ方法,这将执行得非常快,只提供密钥:
var maxValue = dict.Max(p => p.Value);
var keys = dict.Where(p => p.Value == maxValue).Select(p => p.Key);
现在,如果OP知道总是只有一个密钥(没有重复的值),那么改进(非常小)将使用First
,因为懒惰评估只有元素到达在评估完所有最大值之后,将评估具有最大值的一个:
var key = dict.Where(p => p.Value == maxValue).First().Key;
答案 3 :(得分:0)
dict.OrderBy(v => v.Value).Last().Key;
应该这样做。基本上,您按价值排序KeyValuePair
并选择最后一个。在最后一个中你只对Key感兴趣。