gpt4 book ai didi

c# - LINQ 按日期分组,然后按属性排序,以获得最高金额?

转载 作者:太空宇宙 更新时间:2023-11-03 18:51:12 26 4
gpt4 key购买 nike

假设这个模型:

public class Model
{
public DateTime Created { get; set; }
public int Quota { get; set; }
}

我需要指定一年中的特定月份,并提取 Quota 的摘要,但我只需要在该月的每一天获取一个(最大为 31,最小为 28)列表,取决于日期),并且该条目必须是 Quota 最高的条目。示例:

[{
created: "10/1/2019",
quota: 5
}, {
created: "10/1/2019",
quota: 6
}, {
created: "10/2/2019",
quota: 1
}]

在那个例子中,我会得到两个项目:

[{
created: "10/1/2019",
quota: 6
}, {
created: "10/2/2019",
quota: 1
}]

因为 Quota = 6 高于 Quota = 5 并且因为它们在同一日期(10 月 1 日)。

public List<Model> GetMonthlyData(int year, int month)
{
var list = await _dbContext
.Where(x => x.Created.Year == year && x.Created.Month == month)
.GroupBy(x => x.Created.Day)
.OrderByDescending(x => x.Quota)
.Select(x => x.First())
.ToListAsync();

return list;
}

我想要这样的东西。按天分组,降序排列(所以第一个项目的配额最高),选择组中的第一个,并将它们转换为列表。但是,我不知道该怎么做。我敢肯定这真的很简单,但我看不出我的错误在哪里。

最佳答案

您需要将 GroupBy 与以下 Select() 一起使用

 var test = mList
.Where(x => x.Created.Year == year && x.Created.Month == month) //Filter your record based on condition
.GroupBy(x => x.Created.Day) //Group by Created.Day
.Select(x => x.Aggregate((z1, z2) => z1.Quota > z2.Quota ? z1 : z2)) // Aggreate function to Get object with max Qouta
.ToList(); //Convert into List

输出:

10/1/2019    6
10/2/2019 1

我使用了下面的 linq 函数,

.Where() :根据条件过滤记录的 Where 子句在您的情况下是 x.Created.Year == year && x.Created.Month == month

.GroupBy() : 基于谓词的组元素,即基于 x.Created.Day

的组过滤记录

.Aggregate() :在元素上应用指定的逻辑,这里我使用了ternary operator根据最高 Qouta

获取整个对象

.Select() : 获取新形式的对象。

.Net Fiddle

关于c# - LINQ 按日期分组,然后按属性排序,以获得最高金额?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58707728/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com