如果我有
IEnumerable<Something>
和一个带有Something的函数,并返回一个int,我怎么用LINQ告诉我哪些东西在输入我的函数时给出了最高的结果?
答案 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());