在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个元素。
答案 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));