LINQ 中的最大日期记录
Posted
技术标签:
【中文标题】LINQ 中的最大日期记录【英文标题】:max date record in LINQ 【发布时间】:2012-02-04 18:11:54 【问题描述】:我在 MS Sql Server 中有一个名为 sample 的表,其中包含这些值:
ID Date Description
1 2012/01/02 5:12:43 Desc1
2 2012/01/02 5:12:48 Desc2
3 2012/01/03 5:12:41 Desc3
4 2012/01/03 5:12:43 Desc4
现在我想编写 LINQ 查询,结果如下:
4 2012/01/03 5:12:43 Desc4
我写了这个,但它不起作用:
List<Sample> q = (from n in Sample.Max(T=>T.Date)).ToList();
【问题讨论】:
你的select
在哪里?
不起作用 -- 请详细说明。
@GertArnold - OP 在 9 年内没有任何活动。
@Enigmativity 我知道,无论如何我都会留下这样的 cmets,以表明一般不应该这样问问题。
【参考方案1】:
从.NET 6开始MaxBy
LINQ方法可用。
var result = items.MaxBy(i => i.Date);
.NET 6 之前:
O(n log n):
var result = items.OrderByDescending(i => i.Date).First();
O(n) – 但迭代序列两次:
var max = items.Max(i => i.Date);
var result = items.First(i => i.Date == max);
或者你可以使用MoreLINQ,它的MaxBy
方法是O(n)
【讨论】:
请注意,EF Core (link) 不支持MaxBy
【参考方案2】:
要按日期获得最大的Sample
值 不必排序(这并不是真正需要获得最大值):
var maxSample = Samples.Where(s => s.Date == Samples.Max(x => x.Date))
.FirstOrDefault();
【讨论】:
据我了解,这与需要订购的公认答案具有相同的复杂性 @knocte 不,复杂度不一样 - 这是 O(n) - 需要 2 次通过,每次 O(n) - 排序将是 O(n log n) 所以更昂贵 好酷,可以写成只有 1 次通过的方式吗?使用 LINQ 的重点是命令式代码更少,但性能相同或更好 是的 - 它绝对可以用一个老派的foreach
循环一次完成,只需要保持Sample
实例在那个日期之前的最大日期。
这在我看来是O(n^2)
。在 where 子句的每次迭代中都会重新计算最大值。【参考方案3】:
var lastInstDate = model.Max(i=>i.ScheduleDate);
我们可以像这样从模型中获取最大日期。
【讨论】:
不知道为什么没有更多的投票。迄今为止最简单、最高效的 @FrankCastle616 它实际上并没有回答这个问题。这将返回一个日期,而不是包含该日期的记录【参考方案4】:List<Sample> q = Sample.OrderByDescending(T=>T.Date).Take(1).ToList();
但我想你想要
Sample q = Sample.OrderByDescending(T=>T.Date).FirstOrDefault();
【讨论】:
【参考方案5】:这是一个单通道选项:
var maxSample =
Samples
.Aggregate((x, y) => x.Date < y.Date ? y : x);
【讨论】:
【参考方案6】:IList<Student> studentList = new List<Student>()
new Student() StudentID = 1, StudentName = "John", Age = 18 ,
new Student() StudentID = 2, StudentName = "Steve", Age = 15 ,
new Student() StudentID = 3, StudentName = "Bill", Age = 25 ,
new Student() StudentID = 4, StudentName = "Ram" , Age = 20 ,
new Student() StudentID = 5, StudentName = "Ron" , Age = 19
;
var orderByDescendingResult = from s in studentList
orderby s.StudentName descending
select s;
结果: 史蒂夫 罗恩 内存 约翰 比尔
【讨论】:
这与接受的答案完全相同。【参考方案7】:var result= Sample.OrderByDescending(k => k.ID).FirstOrDefault().Date;
这是最好的方法
【讨论】:
这与接受的答案完全相同。以上是关于LINQ 中的最大日期记录的主要内容,如果未能解决你的问题,请参考以下文章
使用多个重复的最大日期时间检索每个组中的最大日期时间记录 - MySQL 问答