摘要:如何获取有序数据组中的前1个元素
我正在尝试按CarId字段进行分组,然后在每个组中,我想对DateTimeStamp字段进行降序排序。所需的数据将是每辆车给我最新的DateTimeStamp,只有组中的那个。
我可以达到这一点,但是在通过DateTimeStamp desc从组中排名前1并排序组时遇到问题。
以下是我在第一组操作后的::
group 1
------------------------
CarId DateTimeStamp
1 1/1/2010
1 1/3/2010
1 3/4/2010
group 2
------------------------
CarId DateTimeStamp
2 10/1/2009
2 1/3/2010
2 9/4/2010
我希望只有订购组中的前1名
group 1
------------------------
CarId DateTimeStamp
1 3/4/2010
group 2
------------------------
CarId DateTimeStamp
2 9/4/2010
Brickwall:我停止的地方,需要group by子句中的CarId和DateTimeStamp,以便稍后按DateTimeStamp排序。也许日期的排序应该在一个单独的函数中完成,不确定。
答案 0 :(得分:17)
data
.GroupBy(
x => x.CardId,
(x, y) => new {
Key = x,
Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault()
}
);
这将按CardId
对所有元素进行分组,然后按DateTimeStamp
(降序)对每个组的元素进行排序,然后将每个组削减为仅包含第一个元素。最后,它会返回一个可忽略的“组”(带有恐慌引号,因为它们实际上是一个匿名类型而不是IGrouping
),其中每个组都有您正在寻找的一个项目。
答案 1 :(得分:2)
我发现自己更容易理解查询表达式语法:
from x in data
group x by x.CarId into grp
select new {
CarId = x.CarId,
Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault()
};