繁体   English   中英

LINQ:分组项目,然后是 select 最小值,最后是 select 最大值

[英]LINQ: Group items, then select Min and finally select Max

我有以下项目清单:

ID     Date
01200  11/11/2020
01200  11/11/2021             
02100  01/01/2019
02100  01/01/2029

我正在尝试按 ID 对项目进行分组,然后对于每个组 select 具有最大日期的项目,最后 select 具有最小日期的项目。 考虑到上述一组项目,最终结果将是 2021 年 11 月 11 日。

所以我在这里实现了两种方法来做同样的事情。 选项 1 有效,但选项 2 无效。

一步步:

// first get the groups:

var groups = items.GroupBy(i => i.ID);

// find the max date in each group
var maxDates = groups.Select(g => g.OrderByDescending(i => i.Date).First());

// now find the earliest max date
var minDate = maxDates.OrderBy(i => i.Date).First();

合并为一行:

var minDate = items.GroupBy(i => i.ID)
                   .Select(g => g.OrderByDescending(i => i.Date).First())
                   .OrderBy(i => i.Date).First();

...GroupBy( p => p.id, p => p.date, (key, g) => new { id = key, date = g.Max() })返回匿名类型的IEnumarable 您不能通过.ToList<Foo>将匿名类型转换为Foo类型。

您应该重写代码以解决编译错误

var res2 = cv.GroupBy(
                         p => p.id, 
                         p => p.date,
                         (key, g) => new Foo{ id = key, date = g.Max()  //add here class name Foo
}).Aggregate((u,v) => u.date < v.date ? u: v);

编辑:

或者,如果您不使用Dump()来显示结果,那么您可以在GroupBy()中使用匿名类型,例如:

var res2 = cv.GroupBy(
                         p => p.id, 
                         p => p.date,
                         (key, g) => new { id = key, date = g.Max() }).Aggregate((u,v) => u.date < v.date ? u: v);

您也可以使用@D Stanley 的想法来查找Foo object,例如:

var minDate = cv.GroupBy(i => i.id,
                         p => p.date,
                         (key, g) => new Foo() { id = key, date = g.Max() }).OrderBy(e=>e.date).First();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM