如何将这两个LINQ查询合并为一个?
var maxEndDate = lstDates.Select(s => s.EndDate).Max();
var record = lstDates.Where(s => s.EndDate == maxEndDate).First();
Run Code Online (Sandbox Code Playgroud)
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或其他),您应该考虑使用不同的方法.
你似乎很可读但是,如果它不满足你,你总是可以调用AsEnumerable
该IQueryable
对象,然后使用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)
请注意,实际上最好不要使用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。如果不是,那么这将从数据库(或任何地方)检索整个集合,这是不希望的。在这种情况下,我就使用你已有的方法。
归档时间: |
|
查看次数: |
162 次 |
最近记录: |