簡體   English   中英

結合兩個LINQ查詢的優雅方式

[英]Elegant way of combining two LINQ queries

如何將這兩個LINQ查詢合並為一個?

var maxEndDate = lstDates.Select(s => s.EndDate).Max();    
var record = lstDates.Where(s => s.EndDate == maxEndDate).First();

MaxBy正是您所尋找的: http//code.google.com/p/morelinq/source/browse/trunk/MoreLinq/MaxBy.cs使用它如下:

var record = lstDates.MaxBy(a => a.EndDate);

編輯1:正如傑森指出的那樣,只有在使用LINQ to Objects時才能使用此方法。 如果您正在查詢數據庫(因此您正在使用LINQ to SQL或其他),您應該考慮使用不同的方法。

你似乎很可讀但是,如果它不滿足你,你總是可以在IQueryable對象上調用AsEnumerable ,然后使用MaxBy方法。

var record = lstDates.AsEnumerable().MaxBy(a => a.EndDate);

編輯2:您可以在查詢中更改的一件事是第二個語句。 嘗試按如下方式縮短它(為了避免使用Where ):

var record = lstDates.First(s => s.EndDate == maxEndDate);
var record = lstDates.OrderByDescending(d => d.EndDate).First();

注意,實際上最好沒有 LINQ。 只需遍歷列表,跟蹤最大日期以及首次找到的項目:

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

foreach (var item in lstDates)
{
    if (item.EndDate > maxDate)
    {
        maxDate = item.EndDate;
        maxItem = item;
    }
}

現在你只迭代一次,而不必進行排序。

這確實假設您正在使用LINQ到對象。 如果你不是,那么這將從數據庫(或任何地方)檢索整個集合,這是不合需要的。 在這種情況下,我會使用您已有的方法。

var record = (from r in lstDates
              orderby r.EndDate descending
              select r).First();

對於鏈接到對象(Linq-to-Sql中不支持聚合)。 以N(n)執行(ok,實際上是O(n + 1))

var record = lstDates.Aggregate(lstDates.First(), 
                                (mx, i) => i.EndDate > mx.EndDate ? i : mx));

對於那些在閱讀時遇到問題的人,第一個參數是累加器的初始值,這將是列表中正常的聚合值,但這里只是保持當前最高記錄。 然后,對於列表中的每個記錄,在給定當前最高項和下一項的情況下調用lambda函數。 它返回新的當前最高值。

var record = lstDates.Where(s => s.EndDate == lstDates.Max(v => v.EndDate)).First();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM