c# - 多重解析的 LINQ 解决方案

标签 c# linq

我有一个MyClass数组,可以简化如下:

public class MyClass {
    public int Id;
    public string Origin;
    public int Points;
    public DateTime RequestTime;
    public MyClass(int id, string origin, int points, DateTime requestTime) {
        Id = id;
        Origin = origin;
        Points = points;
        RequestTime = requestTime;
    }
}

现在,在Array中,在用户端或整个输入过程中没有任何错误的情况下,不可能有具有相同IdMyClass实例> 和 来源

但是,如果有的话,我应该解决它。以下是解析规则:

  1. 首先按Points - 也就是说,在具有最高Points

    的副本中选择一个/li>
  2. 但如果 Points 相同,我必须使用 RequestTime 进一步解决它 - 将采用最新的。

    <
  3. 如果 RequestTime 没有区别,那么我可以任意取其中一个副本。

这是我的示例数据输入:

MyClass[] myarr = new MyClass[] {
    new MyClass(1, "Ware House 1", 5, new DateTime(2016, 1, 26, 14, 0, 0)), //[0]
    new MyClass(1, "Ware House 1", 7, new DateTime(2016, 1, 26, 14, 0, 0)), //[1] //higher points
    new MyClass(1, "Ware House 2", 7, new DateTime(2016, 1, 26, 14, 0, 0)), //[2]
    new MyClass(1, "Ware House 2", 7, new DateTime(2016, 1, 26, 14, 1, 0)), //[3] //later time
    new MyClass(1, "Ware House 2", 7, new DateTime(2016, 1, 26, 14, 0, 0)), //[4]
    new MyClass(2, "Ware House 2", 7, new DateTime(2016, 1, 26, 14, 0, 0)), //[5] //higher points
    new MyClass(2, "Ware House 2", 5, new DateTime(2016, 1, 26, 14, 1, 0)), //[6] //later time but less points
    new MyClass(3, "Ware House 1", 6, new DateTime(2016, 1, 26, 14, 0, 0)), //[7] //triplet, pick any
    new MyClass(3, "Ware House 1", 6, new DateTime(2016, 1, 26, 14, 0, 0)), //[8] //triplet, pick any
    new MyClass(3, "Ware House 1", 6, new DateTime(2016, 1, 26, 14, 0, 0)) //[9] //triplet, pick any
};

最终结果应该是[1], [3], [5], + [7]/[8]/[9]中的任意一个

我想为它实现 LINQ 解决方案,但卡住了。我不知道如何立即查询它。

有什么想法吗?

最佳答案

按 {Id, Origin} 分组,当按 Points 排序时,从每组中取出第一个RequestTime:

var query = from x in myarr
    group x by new {x.Id, x.Origin}
    into g
    select (
        from z in g
        orderby z.Points descending, z.RequestTime descending
        select z).First();

在方法语法中,这是:

var query =
    myarr.GroupBy(x => new {x.Id, x.Origin})
         .Select(g => g.OrderByDescending(z => z.Points)
                       .ThenByDescending(z => z.RequestTime)
                       .First());

关于c# - 多重解析的 LINQ 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35008529/

相关文章:

c# - 如何重用相同的变量,但用于不同的类型?

c# - 将带有值的变量传递给 postgresql 数据库

c# - 如何使用套接字欺骗 IP 地址?

c# - 在 C# 中动态评估字符串条件

c# - 如何从不在 IEnumerable 中的数据表中选择数据

c# - LINQ:SubmitChanges 上的多个 DeleteOnSubmit 订单行为

c# - Visual Studio 2019 : Is there any way to prevent parallel execution of test methods in a [TestClass]?

c# - 如何使用 ASP.NET Core 从 DbContext 中的 JWT 获取用户名?

sql-server - LINQ(到 Oracle)- Row_Number() Over Partition By

c# - 如何将 SQL Server 表拉入内存以便对其运行查询