首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按Date.Date分组

按Date.Date分组
EN

Stack Overflow用户
提问于 2018-03-12 14:48:38
回答 4查看 132关注 0票数 0

我正在努力做一个group by。我有以下列表:

代码语言:javascript
复制
 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  

我想要这份名单:

代码语言:javascript
复制
 Date = 10/03, Val = 5  
 Date = 11/03, Val = 14

因此,列表按Date.Date分组,但Val取决于Max(d => d.Date)

我是用foreach做的,但我很确定我们可以用LINQ (groupbyselect)做得更好。有什么想法吗?

干杯

EN

回答 4

Stack Overflow用户

发布于 2018-03-12 15:01:11

我相信你想要这样的东西

代码语言:javascript
复制
static T MaxBy<T, TKey>(this IEnumerable<T> source, Func<T, TKey> selector)
where TKey: IComparable<TKey> =>
    source.OrderByDescending(selector).First();

然后

代码语言:javascript
复制
from item in items
group item by item.Date.Date into byDate
select new
{
    Date = byDate.Key,
    byDate.MaxBy(item => item.Date).Val
} 

如果您不希望创建专用方法,当然也可以内联创建

代码语言:javascript
复制
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,他指出了一个错误,我随后得以更正。

票数 2
EN

Stack Overflow用户

发布于 2018-03-12 14:52:49

它应该是这样的:

代码语言:javascript
复制
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
             };
票数 1
EN

Stack Overflow用户

发布于 2018-03-12 14:59:00

大致是这样的:

代码语言:javascript
复制
values
    .GroupBy(value => value.Date.Date)
    .Select(grouped => new
        {
            Date = grouped.Key,
            Val = values.First(value => value.Date == grouped.Date.Max()).Val
        });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49229510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档