使用LINQ来找到哪个元素“;得分最高”;关于某个函数
本文关键字:函数 于某个 LINQ 元素 使用 | 更新日期: 2023-09-27 18:15:54
如果我有
IEnumerable<Something>
以及一个接受Something并返回int的函数,我如何使用LINQ来告诉我,当输入到我的函数时,我的somethings中的哪一个给出了最高的结果?
您可以从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(((;