[英]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.