Linq 查询根据日期和优先级获取不同的对象

Posted

技术标签:

【中文标题】Linq 查询根据日期和优先级获取不同的对象【英文标题】:Linq query to get distinct object based on date and priority 【发布时间】:2021-12-30 06:47:35 【问题描述】:

我有一个具有 DateTime 和 Priority 属性的对象列表。

public class DayResponse

    public DateTime Date  get; set; 
    public int Priority  get; set; 
    ...

可以有相同日期但优先级不同的对象(1 是最高优先级,6 是最低优先级),然后我想获得具有最高(最低 int 值)优先级的对象。因此,结果应该是一个包含所有唯一日期的对象的列表,并且在存在“冲突”的地方,具有最高优先级的对象就是结果中的对象。是否有 linqquery 来执行此操作?我知道我可以得到不同的日期,然后循环遍历它们,如果同一日期有多个日期,则获得最高优先级,但 linq 总是很好 :) 我有 MoreLinq 包,所以存在 DistinctBy。

【问题讨论】:

【参考方案1】:

您可以按照Date 对条目进行分组,然后使用MinBy 选择具有最低Priority 的条目。

sequence.GroupBy(d => d.Date).Select(g => g.MinBy(d => d.Priority));

MinBySystem.Linq 中开箱即用,因为.NET 6。它也可以取自MoreLinq,但请注意,在MoreLinq 中,返回类型是一个包含所有具有相同最低优先级的值的可枚举,因此您需要使用SelectMany

sequence.GroupBy(d => d.Date).SelectMany(g => g.MinBy(d => d.Priority));

.NET 6 演示:

using System;
using System.Linq;

var sequence = new DayResponse[] 
    new()  Date = new DateTime(2000, 01, 01), Priority = 1,
    new()  Date = new DateTime(2001, 01, 01), Priority = 2,
    new()  Date = new DateTime(2001, 01, 01), Priority = 5,
;

var distinct = sequence.GroupBy(d => d.Date).Select(g => g.MinBy(d => d.Priority));

foreach (var x in distinct)

    Console.WriteLine($"DayResponse: Date = x.Date, Priority = x.Priority");


public class DayResponse

    public DateTime Date  get; set; 
    public int Priority  get; set; 

可在此处获取:https://dotnetfiddle.net/SLnkSr

【讨论】:

不指定 c# 版本很糟糕,所以我必须重写所提供代码的某些部分,但是自从在 Core 3.1 c# 8 中运行它以来,我不知道我是否有一些语言功能缺少,但对我来说,不同的是 IEnumerable> 并且 x 无法解析日期或优先级 @Hyzac 糟糕,我忘记了 MoreLinq 具有不同的签名 MinBy 并返回具有相同值的所有元素,您希望将其最小化。更新了答案以反映这一点。

以上是关于Linq 查询根据日期和优先级获取不同的对象的主要内容,如果未能解决你的问题,请参考以下文章

Hive 查询:根据优先级和日期计算最大指标值

根据需要在LINQ查询分配对象中设置日期格式

使用 linq/Entity Framework 查询多对多关系。代码优先

用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)

DataServiceContext & Linq:只选择继承的对象

使用 LINQ 的对象层次结构的深度优先扁平化集合