c# - 是否有一个 LINQ 语句可以根据其属性之一的最大值从枚举中选择一个对象?

标签 c# linq lambda

我们有一个具有 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值(我假设 pairsICollection<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/

相关文章:

c# - 计算表中某列值的总和

Java 8 Lambda 按列表过滤

r - cv.glmnet 和 Leave-one out CV

c# - 我误解了 PetaPoco.IgnoreAttribute 吗?

c# - 空合并运算符的右关联如何表现?

c# - 如何将项目列表从 View 传递到 Controller (ASP.NET MVC 4)

c# - 动态表达式不支持 Like

c# - 如何使用 LINQ to XML 从两个 Atom 提要创建聚合 Atom 提要

vb.net - 'ByRef' 参数 '<parametername>' 不能在 lambda 表达式中使用

c# - 如何以编程方式访问焦点元素 WPF C#