我正在努力做一个group by。我有以下列表:
Date = 10/03 06:40 AM, Val = 10
Date = 10/03 08:55 PM, Val = 5
Date = 11/03 06:40 AM, Val = 5
Date = 11/03 10:50 AM, Val = 9
Date = 11/03 06:40 PM, Val = 14 我想要这份名单:
Date = 10/03, Val = 5
Date = 11/03, Val = 14因此,列表按Date.Date分组,但Val取决于Max(d => d.Date)。
我是用foreach做的,但我很确定我们可以用LINQ (groupby,select)做得更好。有什么想法吗?
干杯
发布于 2018-03-12 15:01:11
我相信你想要这样的东西
static T MaxBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector)
where TKey: IComparable<TKey> =>
source.OrderByDescending(selector).First();然后
from item in items
group item by item.Date.Date into byDate
select new
{
Date = byDate.Key,
byDate.MaxBy(item => item.Date).Val
} 如果您不希望创建专用方法,当然也可以内联创建
from item in items
group item by item.Date.Date into byDate
let ordered = from item in byDate
orderby item.Date descending
select item.Val
select new
{
Date = byDate.Key,
Val = ordered.First()
}注:感谢mjwills,他指出了一个错误,我随后得以更正。
发布于 2018-03-12 14:52:49
它应该是这样的:
var result = from d in list
group d by d.Date.Date into grouped
let max = grouped.Max(d => d.Date)
select new {
Date = grouped.Key,
list.FirstOrDefault(c => c.Date == max)?.Val
};发布于 2018-03-12 14:59:00
大致是这样的:
values
.GroupBy(value => value.Date.Date)
.Select(grouped => new
{
Date = grouped.Key,
Val = values.First(value => value.Date == grouped.Date.Max()).Val
});https://stackoverflow.com/questions/49229510
复制相似问题