使用LINQ查找哪个元素在某个函数上“得分最高”

时间:2011-11-26 20:42:16

标签: c# linq

如果我有

IEnumerable<Something>

和一个带有Something的函数,并返回一个int,我怎么用LINQ告诉我哪些东西在输入我的函数时给出了最高的结果?

4 个答案:

答案 0 :(得分:3)

您可以使用MaxBy from MoreLinq之类的内容(或只使用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;
    }
}

答案 1 :(得分:2)

您可以使用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));

答案 2 :(得分:1)

var something= List.Aggregate((p, q) => func(p) > func(q) ? p : q)

这个聚合很简单但是调用func方法在每次迭代中出现两次max,以避免这种情况:

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

答案 3 :(得分:-1)

somethings.Max(p =&gt; p.intFunc());