用于多个解决方案的LINQ解决方案

Ian*_*Ian 7 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在Array没有来自用户端或整个输入过程的任何错误的MyClass情况下,不能存在具有相同Id和的实例Origin.

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

  1. 首先Points- 也就是说,取一个具有最高权重的副本Points

  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
};
Run Code Online (Sandbox Code Playgroud)

最终的结果应该是 [1], [3], [5], + any of [7]/[8]/[9]

我想LINQ为它实现解决方案,但卡住了.我不知道怎么一次查询它.

任何的想法?

lc.*_*lc. 8

按{ 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();
Run Code Online (Sandbox Code Playgroud)

在方法语法中,这是:

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