C# 理解C语言中的lambda表达式#

C# 理解C语言中的lambda表达式#,c#,linq,lambda,C#,Linq,Lambda,我是兰博达斯的新手,在我尝试做更复杂的事情之前,他们看起来相当直截了当。 我有这本字典 Dictionary<int, int> dict = new Dictionary<int,int>(); 理由是,从键列表中选择dict[key]最大的一个。但是,这会选择最大值本身,而不是相应的键。dict.OrderBy(v=>v.value).Last().key 我应该这样做。基本上,您是按值排序KeyValuePair,然后选择最后一个最大值。在最后一个函数中,您只对键

我是兰博达斯的新手,在我尝试做更复杂的事情之前,他们看起来相当直截了当。 我有这本字典

Dictionary<int, int> dict = new Dictionary<int,int>();
理由是,从键列表中选择dict[key]最大的一个。但是,这会选择最大值本身,而不是相应的键。

dict.OrderBy(v=>v.value).Last().key


我应该这样做。基本上,您是按值排序
KeyValuePair
,然后选择最后一个最大值。在最后一个函数中,您只对键感兴趣。

dict.Keys.OrderByDescending(g=>dict[g])。First()
将实现您想要的功能,但对于大型词典来说可能效率低下<约翰·斯基特(John Skeet)的《代码>麦克斯比》(code>MaxBy)将有效地满足您的需求

var maxValue = dict.Max((maxPair) => maxPair.Value);
var maxPairs = dict.Where((pair) => pair.Value == maxValue);
这将为您提供具有最大值的所有对的列表

如果您只需要钥匙,可以在以后执行此操作:

var maxKeys = maxPairs.Select((pair) => pair.Key);

我决定根据我对麦凯的想法添加一个答案。鉴于标准LINQ方法,这将执行得非常快,只提供了关键点:

var maxValue = dict.Max(p => p.Value);
var keys = dict.Where(p => p.Value == maxValue).Select(p => p.Key);
现在,如果OP知道始终只有一个键(没有重复值),那么改进(非常小)将是首先使用
进行此操作,因为延迟评估,只有在评估所有元素后,才会评估最大值的元素,以首先找到最大值:

var key = dict.Where(p => p.Value == maxValue).First().Key;

这不是真正的代码,你应该在第二段的左边放一些东西。让它成为一个任务来取得进展,var关键字很好。因为你似乎误解了我,我将进一步说明:我正在寻找一个表达式,它将从字典中所有值中最大的键值对中计算出键的值。我希望这能让它更清楚一些。OP想要的是对应于最大值的键,而不是最大值的键。您可能已经编写了
dict.Values.Max()
。这是一个很容易犯的错误;我一直这样做。我的假设正确吗?因为它避免了其他建议答案的排序程序,所以速度会快得多。到目前为止,我认为是最好的解决方案。
MaxBy
会更快,因为这种方法必须在键列表上迭代两次。@martixy是的,顺序是O(n log n),其中这个模式是O(n)。@recursive:correct MaxBy可能会更快,但仍然是O(n)的相同顺序。此外,我相信这与MaxBy的行为稍有不同?实际上,这比排序的性能要差得多。问题是对每个元素执行对dict.Max的内部调用。这不是LINQ自动缓存的。执行上述操作的正确方法是:
var maxValue=dict.Max(p=>p.Value);var maxPairs=dict.Where(p=>p.Value==maxValue)。在我的10000个元素的系统上,性能是:这个答案=3982ms,
OrderBy
=113ms,我的=13ms。我还建议回答您需要添加
的问题。选择(p=>p.Key)
以获取具有最大值的元素的键,而不是键值对。您提到,如果没有重复值,这是一种改进,但在某些情况下,这可能是您想要的。您可能不希望拥有所有具有最大值的键,而只希望拥有任何具有最大值的键。所以这个解决方案可能就是你想要的。我只是觉得一般来说这样做是不对的。请注意,我的代码(以及代码的第一部分)只计算最大值,并将键的查找留待以后进行。也许你想要第一个,也许你想要计数,也许你想要把它们全部打印到屏幕上。该列表是可查询的。
var key = dict.Where(p => p.Value == maxValue).First().Key;