理解C#中的lambda表达式

时间:2011-12-28 23:49:15

标签: c# linq lambda

我是lambdas的新手,在我尝试做一些更复杂的事情之前,他们看起来相当直接。 我有这本字典。

Dictionary<int, int> dict = new Dictionary<int,int>();

我希望获得具有最大值的key-val对的键。我试过的是:

dict.Keys.Max(g => dict[g])

理由是,在Keys列表中,选择dict [key]最大的那个。但是,这会选择最大的值,而不是相应的键。

4 个答案:

答案 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感兴趣。