结合两个LINQ查询的优雅方式

use*_*134 8 c# linq

如何将这两个LINQ查询合并为一个?

var maxEndDate = lstDates.Select(s => s.EndDate).Max();    
var record = lstDates.Where(s => s.EndDate == maxEndDate).First();
Run Code Online (Sandbox Code Playgroud)

as-*_*cii 8

MaxBy正是您正在寻找的:http://code.google.com/p/morelinq/source/browse/trunk/MoreLinq/MaxBy.cs使用它像这样:

var record = lstDates.MaxBy(a => a.EndDate);
Run Code Online (Sandbox Code Playgroud)

编辑1:正如杰森指出的那样,只有在使用LINQ to Objects时才能使用此方法.如果您正在查询数据库(因此您正在使用LINQ to SQL或其他),您应该考虑使用不同的方法.

你似乎很可读但是,如果它不满足你,你总是可以调用AsEnumerableIQueryable对象,然后使用MaxBy方法.

var record = lstDates.AsEnumerable().MaxBy(a => a.EndDate);
Run Code Online (Sandbox Code Playgroud)

编辑2:您可以在查询中更改的一件事是第二个语句.尝试按如下方式缩短它(为了避免使用Where):

var record = lstDates.First(s => s.EndDate == maxEndDate);
Run Code Online (Sandbox Code Playgroud)


dle*_*lev 1

请注意,实际上最好不要使用LINQ。只需循环遍历列表,跟踪最大日期以及首次找到该日期的项目:

DateTime maxDate = default(DateTime);
YourClass maxItem = null;

foreach (var item in lstDates)
{
    if (item.EndDate > maxDate)
    {
        maxDate = item.EndDate;
        maxItem = item;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您只需迭代一次,并且不必承受排序的麻烦。

这确实假设您正在使用 LINQ-to-Objects。如果不是,那么这将从数据库(或任何地方)检索整个集合,这是不希望的。在这种情况下,我就使用你已有的方法。