我们有一个具有 count 属性的对象集合,如下所示...
Item A : Count 4
Item B : Count 2
Item C : Count 5 <-- We want this one
Item D : Count 3
(Note the actual list can have hundreds of items.)
我们正在尝试编写一个返回“Item C”的 LINQ 语句,因为它具有最高的 Count 值。
注意:我们不需要计数。我们想要计数最高的项目。
当然,这可以通过简单的循环结构轻松完成,但我想知道是否可以纯粹使用 LINQ 来实现。
我唯一能想到的就是使用这样的聚合语句......
var item = Screen.Items
.Aggregate( (highestItem, nextItem) =>
highestItem = (highestItem == null)
? nextItem
: (highestItem.Count < nextItem.Count)
? nextItem
: highestItem);
虽然看起来很冗长。有其他更短的方法吗?
最佳答案
您可以使用默认的 Max()
LINQ 扩展,如果您只需要 Count
值(我假设 pairs
是 ICollection<KeyValuePair<Item, int>>
)。
var highestCount = pairs.Max(pair => pair.Value);
或者您可以添加 MoreLINQ nuget 并使用 MaxBy()
扩展获取Item
:
var itemWithHighestCount = pairs.MaxBy(pair => pair.Value).Key;
更新:
只是想分享一些性能结果。对于List<object, long>
1000万个元素的随机集合long
值(10 次运行的平均时间):
-
Aggregate
需要430毫秒 -
OrderBy
需要5,991毫秒 -
MaxBy
来自 MoreLINQ 需要 231 毫秒
关于c# - 是否有一个 LINQ 语句可以根据其属性之一的最大值从枚举中选择一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31633745/