我有一个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
中,在用户端或整个输入过程中没有任何错误的情况下,不可能有具有相同Id
的MyClass
实例> 和 来源
。
但是,如果有的话,我应该解决它。以下是解析规则:
首先按
的副本中选择一个/li>Points
- 也就是说,在具有最高Points
但如果
<Points
相同,我必须使用RequestTime
进一步解决它 - 将采用最新的。如果
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/