2013-10-01 67 views
2

這相當於一個相關的子查詢,其中您想要具有最大或最小X(而不是最大或最小X本身)的行。我只能通過分揀和挑選第一個項目來獲得它。根據LINQ中的最小值或最大值選擇一個值

public static TSource PickMin<TSource, TMin>(this IEnumerable<TSource> source, Func<TSource, TMin> selector) where TMin : IComparable<TMin> 
{ 
    return source.OrderBy(selector).FirstOrDefault(); 
} 

這聽起來並不像最有效的方法。我認爲有.Contains.Min的組合可以做到這一點?或者,這與LINQ獲得的一樣好嗎?

回答

3

您可以使用聚合,這是O(n)(和其幕後使用AFAIR,當你調用Min()Max()等):

public static TSource PickMin<TSource, TMin>(this IEnumerable<TSource> source, Func<TSource, TMin> selector) where TMin : IComparable<TMin> 
{ 
    var first = source.FirstOrDefault(); 
    return source.Aggregate(first, (min, current) => selector(current).CompareTo(selector(min)) < 0 ? current : min); 
} 

如果您希望它在空集合上引發異常(而不是返回默認值),請刪除第一行。

1

直接在LINQ中沒有好的方法。什麼你可以是使用MinBy()MoreLINQ

+0

Ix(來自Rx團隊)也這樣做。 –

相關問題