使用Linq查找C#通用列表中的最新项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Linq查找C#通用列表中的最新项目相关的知识,希望对你有一定的参考价值。

我有一个通用的项目清单。每个项目都包含一个DateTime字段。我想以最优雅和最有效的方式使用Linq找到列表中的最新项目。

在我的情况下,优雅比效率更重要,但是以有效的方式做这件事也会很好。

谢谢。

阅读答案后:这是代码(和我喜欢的答案):

using System.Collections.Generic;
using System.Linq;

class Item
{
    public Item Date { get; set; }
    public string Name { get; set; }
}

static void Main(string[] args)
{
    List<Item> items = CreateItems();
    Item newest;
    if (items.Count == 0)
        newest = null;
    else
        newest = items.OrderByDescending(item => item.Date).First();
}
答案

为了优雅,我会根据日期时间字段对集合进行排序并返回第一个项目,如:

set.OrderByDescending(x => x.DateTime)
   .FirstOrDefault();

这将创建已排序集合的内存中表示,因此效率不高。对于未排序的集合,最有效的解决方案是循环所有项目并保存最新的。您可以通过执行聚合操作来使用linq,我发现在语法上一团糟。

或者,您可以将项目存储在SortedSet等已排序的集合中。对于大多数集合,这有一个更复杂的插入时间0(log2)而不是O(1),但它允许您对日期时间进行无差别排序,因此选择O(1)中的最新项而不是O(n)。

另一答案

到目前为止,大多数解决方案必须首先对列表进行完全排序(通过OrderByDescending),这是不必要且耗时的。你想要的是Jon Skeet的MoreLinq MaxBy功能。 MaxBy的来源是google code

var newest = thelist.MaxBy(x => x.DateTimeField);
另一答案

试试看:

var newItem = myList.OrderByDescending(item => item.yourDateTimeField).First();
另一答案

尝试聚合,即:

list.Aggregate (
    DateTime.MinValue,
    (lastOne, current) => current.GreaterThan (lastOne) ? current : lastOne
)

即如果你的字段是DateTimeField,你应该写类似的东西

list.Aggregate (
    null,
    (lastOne, current) => 
        (lastOne == null) ||
             current.DateTimeField.GreaterThan (lastOne.DateTimeField)
        ? current
        : lastOne
)
另一答案

试试这个

 sortlist.OrderByDescending(a => a.timeStamp).First();

以上是关于使用Linq查找C#通用列表中的最新项目的主要内容,如果未能解决你的问题,请参考以下文章

如何根据多个条件并使用 linq 从通用列表中删除项目

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

在c#中使用lambda或linq查找项目索引[关闭]

根据另一个列表中的真实条件从通用列表中选择项目

使用 LINQ 将项目移动到列表顶部

C# LINQ 在列表中查找重复项