LINQ:将项目分组,然后选择“最小”,最后选择“最大”

时间:2019-11-11 21:19:02

标签: c# linq

我的物品清单如下:

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无效。

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();