【问题标题】:Group items and select specific item from each group with LINQ使用 LINQ 对项目进行分组并从每个组中选择特定项目
【发布时间】:2011-02-16 14:43:43
【问题描述】:

必须有一个单线才能做到这一点,但我就是找不到。

给定这个查询:

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

我需要为每个不同的 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 */
}

...但是 ToLookup 感觉有点笨拙。还是我有最好(最简单)的解决方案?

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

提前致谢!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    我想你想要:

    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
            };
    

    (请注意,从组中查找“最大”元素的方法比先排序更高效,例如使用MaxBy 运算符。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-27
      相关资源
      最近更新 更多