c# - 如何通过 linq 查询对组中的元素进行排序,然后选择第一个?

标签 c# linq group-by

我有一组数据,其中包含类型、日期和值。

我想按类型分组,对于每组中的每组值,我想选择具有最新日期的值。

这是一些有效的代码并给出了正确的结果,但我想在一个 linq 查询中而不是在迭代中完成这一切。我有什么想法可以通过纯 linq 查询获得与此相同的结果...?

var mydata = new List<Item> {
    new Item { Type = "A", Date = DateTime.Parse("2016/08/11"), Value = 1 },
    new Item { Type = "A", Date = DateTime.Parse("2016/08/12"), Value = 2 },
    new Item { Type = "B", Date = DateTime.Parse("2016/08/20"), Value = 3 },
    new Item { Type = "A", Date = DateTime.Parse("2016/08/09"), Value = 4 },
    new Item { Type = "A", Date = DateTime.Parse("2016/08/08"), Value = 5 },
    new Item { Type = "C", Date = DateTime.Parse("2016/08/17"), Value = 6 },
    new Item { Type = "B", Date = DateTime.Parse("2016/08/30"), Value = 7 },
    new Item { Type = "B", Date = DateTime.Parse("2016/08/18"), Value = 8 },
};

var data = mydata.GroupBy(_ => _.Type);

foreach (var thing in data) {

    #region 
            
    // How can I remove this section and make it part of the group by query above... ?          
    var subset = thing.OrderByDescending(_ => _.Date);
    var top = subset.First();
    
    #endregion
    
    Console.WriteLine($"{thing.Key} {top.Date.ToString("yyyy-MM-dd")} {top.Value}");
}

Item 定义为:

public class Item {     
    public string Type {get;set;}
    public DateTime Date {get;set;}
    public int Value {get;set;}     
}   
            

预期输出:

A 2016-08-12 2
B 2016-08-30 7
C 2016-08-17 6

最佳答案

使用 select 获取按降序排列的 FirstOrDefault(或 First - 因为分组你不会得到 null):

var data = mydata.GroupBy(item => item.Type)
                 .Select(group => group.OrderByDescending(x => x.Date)
                 .FirstOrDefault())
                 .ToList();

或者 SelectManyTake(1)

var data = mydata.GroupBy(item => item.Type)
                 .SelectMany(group => group.OrderByDescending(x => x.Date)
                 .Take(1))
                 .ToList();

关于c# - 如何通过 linq 查询对组中的元素进行排序,然后选择第一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38898907/

相关文章:

c# - 任务中的异步套接字操作

c# - 用于转换超链接的 RegExp 帮助

python - 在 python pandas 中的 groupby 之后填写列中缺少的行

mysql group by 并对每个组进行排序

c# - 在这种情况下嵌套 LINQ 查询?如何创建嵌套的groupby?

c# - .Net工具来记录方法

c# - 为什么 AsyncUnaryCall<T> 和其他人不扩展 Task<T>?

c# - 使用数组对 List<T> 进行排序

c# - Entity Framework Core 中 TimeSpan 的总和

linq - 使用动态 Linq Entity Framework 查询引发的奇怪异常