2

这相当于一个相关的子查询,您想要具有最大或最小 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 一样好?

4

2 回答 2

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);
}

如果您希望它在空集合上引发异常(而不是返回默认值),请删除第一行。

于 2013-10-02T05:59:10.550 回答
1

没有直接在 LINQ 中执行此操作的好方法。您可以MinBy()MoreLINQ使用

于 2013-10-01T22:17:27.723 回答