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开始MaxByLINQ方法可用。

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 问答

如何根据 MySQL 中的最大日期仅选择左表的一条记录?

Oracle 选择多条记录的最大日期

LINQ - 选择每组具有最大属性值的记录

如何在 Asp.net MVC C# 中使用 Linq 从多个表中选择具有最大计数值的记录

使用 Linq C# 获取元组对象列表中的最新日期对象