2013-10-01 66 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团队)也这样做。 –

相关问题