使用LINQ来找到哪个元素“;得分最高”;关于某个函数

本文关键字:函数 于某个 LINQ 元素 使用 | 更新日期: 2023-09-27 18:15:54

如果我有

IEnumerable<Something>

以及一个接受Something并返回int的函数,我如何使用LINQ来告诉我,当输入到我的函数时,我的somethings中的哪一个给出了最高的结果?

使用LINQ来找到哪个元素“;得分最高”;关于某个函数

您可以从MoreLinq使用类似MaxBy的东西(或者简单地使用MoreLinq(:

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
    using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
    {
        if (!sourceIterator.MoveNext())
            throw new InvalidOperationException("Sequence was empty");
        TSource max = sourceIterator.Current;
        TKey maxKey = selector(max);
        while (sourceIterator.MoveNext())
        {
            TSource candidate = sourceIterator.Current;
            TKey candidateProjected = selector(candidate);
            if (comparer.Compare(candidateProjected, maxKey) > 0)
            {
                max = candidate;
                maxKey = candidateProjected;
            }
        }
        return max;
    }
}

您可以使用OrderByDescending:

Something result = yourEnumerable.OrderByDescending(x => f(x)).First();

请注意,如果您使用LINQ to Objects,这将导致O(n log n(排序。

您也可以使用MoreLINQ:中的MaxBy

Something result = yourEnumerable.MaxBy(x => f(x));
var something= List.Aggregate((p, q) => func(p) > func(q) ? p : q)

这个聚合很简单,但每次迭代都会为max调用func方法两次,以避免这种情况:

var something=List.Select(p => new { something = p, call = func(p) })
                        .Aggregate((p, q) => p.call > q.call ? p : q).something;

somethings.Max(p=>p.intFunc(((;