在LINQ中根据最小值或最大值选择一个值

时间:2013-10-01 21:17:20

标签: c# linq

这相当于一个相关的子查询,您需要具有最大或最小X(而不是最大或最小X本身)的行。我只能通过排序和挑选第一项来获得它。

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一样好吗?

2 个答案:

答案 0 :(得分:3)

您可以使用聚合,O(n)(当您调用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 :(得分:1)

在LINQ中没有直接这样做的好方法。您可以使用MoreLINQ

中的MinBy()