我的物品清单如下:
ID Date
01200 11/11/2020
01200 11/11/2021
02100 01/01/2019
02100 01/01/2029
我试图按ID对项目进行分组,然后为每个组选择具有最大日期的项目,最后选择具有最小日期的项目。考虑到以上项目,最终结果将是2021年11月11日。
因此,我已经实现了两种方法here来完成相同的操作。选项1有效,但选项2无效。
答案 0 :(得分:1)
分步操作:
// 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();
答案 1 :(得分:0)
...GroupBy(
p => p.id,
p => p.date,
(key, g) => new { id = key, date = g.Max() })
返回匿名类型的IEnumarable
。您无法通过Foo
将匿名类型转换为.ToList<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
对象,例如:
var minDate = cv.GroupBy(i => i.id,
p => p.date,
(key, g) => new Foo() { id = key, date = g.Max() }).OrderBy(e=>e.date).First();