使用LINQ对每个组中的项目进行分组并选择特定项目

Ben*_*n H 5 c# linq

必须有一个单行来做这个,我找不到它.

鉴于此查询:

from x in new XPQuery<XPContent>(s)
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }
Run Code Online (Sandbox Code Playgroud)

我需要为每个不同的ContentID选择具有最大日期的记录.使用LINQ可以巧妙地完成这项工作吗?现在我这样做:

var q = (from x in new XPQuery<XPContent>(s)
            select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }).ToList();

var r = q.ToLookup(item => item.ContentID);
foreach (var rItem in r) {
    var s = rItem.OrderByDescending(a => a.Date).First();
    /* do stuff with s */
}
Run Code Online (Sandbox Code Playgroud)

......但ToLookup感觉有点笨重.或者我有最好的(最简单的)解决方案?

另外,我知道我不应该使用ToList,但请暂时忽略它.

提前致谢!

Ani*_*Ani 6

我想你想要:

var q = from x in new XPQuery<XPContent>(s)
        group x by x.ContentID into g
        let latest = g.OrderByDescending(a => a.Date).First()
        select new 
        {
            latest.Category, latest.ContentType,
            latest.Name, latest.ContentID, latest.Date
        };
Run Code Online (Sandbox Code Playgroud)

(请注意,有更多高效的方法可以从组中查找'maximum'元素,而不是先对其进行排序,例如使用MaxBy运算符.)

查询非常简单; 它只是按项目对项目进行ContentId分组,然后从每个组中选择一个匿名类型的实例,该实例是从该组的最新项目生成的.