根据最高日期从IGrouping中获取项目

时间:2011-06-30 20:53:24

标签: c# linq lambda

IEnumerable<Appointment>中包含定义为:

的约会
class Appointment
{
  public string Name { get; set; }
  public DateTime LastModified { get; set; }
  public bool IsCancelled { get; set; }
}

在实践中可以像:

"Jon S" | 25-02-2011 16:14:40 | true
"Jon S" | 25-04-2011 22:15:44 | false
"Marc G" | 15-11-2011 16:09:00 | true
"Marc G" | 21-12-2011 16:11:00 | false
"Marc G" | 20-12-2011 16:24:00 | true
"Eric L" | 13-06-2011 19:10:00 | false
"Reed C" | 13-04-2011 09:10:00 | true
"Reed C" | 13-06-2011 19:10:00 | false
"John G" | 04-01-2011 06:12:00 | true
"Jon S" | 25-03-2011 12:24:42 | true

此集合必须缩小为仅包含约会的集合,并且每个不同名称的最高日期LastModified

"Jon S" | 25-04-2011 22:15:44 | false
"Marc G" | 21-12-2011 16:11:00 | false
"Eric L" | 13-06-2011 19:10:00 | false
"Reed C" | 13-06-2011 19:10:00 | false
"John G" | 04-01-2011 06:12:00 | true

我有点困惑如何做到这一点。我试过的时候:

 .GroupBy(n => n.Name)
 .Select(d => d.Max(t => t.LastModified));

它似乎提供了正确的日期,但需要整个实体,我缺少什么?

更新/注意:这是一个大型集合,包含大约10.000个未分类的项目,由服务提供我无法修改。每个不同的组有大约20个元素。

3 个答案:

答案 0 :(得分:5)

.GroupBy(n => n.Name)
.Select(d => d.OrderByDescending(t => t.LastModified).First())

答案 1 :(得分:1)

.GroupBy(appt => appt.Name, (key, group) =>
{
    var maxDt = group.Max(appt => appt.LastModified);
    return group.First(appt => appt.LastModified == maxDt);
});

可能比以前的解决方案更好的性能

答案 2 :(得分:1)

在Linq查询语法中:

        var last = from app in apps
                   orderby app.LastModified descending
                   group app by app.Name into grp
                   select grp.First();                    

您的版本为max:

        var lastApp = from app in apps
                      group app by app.Name into grp
                      select grp.First(last => last.LastModified == grp.Max( g => g.LastModified));