我有这样一种情况:我有一个对象列表,其中包含一个int属性,我需要找出该属性值最高的3个对象。MoreLinq MaxBy函数非常方便地查找单个最高值,但是否有办法使用该函数查找前三个最高值?(不一定是相同的值)。我目前正在使用的实现方式是使用MaxBy查找单个最高值,从列表中删除该对象并再次调用MaxBy,以此类推,直到找到三个最高值为止,然后将对象添加回列表。仅想到这种实现方式就让我感到不舒服,我真的很想找到更好的方法。
MaxBy
(包括MinBy
)被更改为返回一个序列而不是单个项。PartialSort
或 PartialSortBy
。下面的示例使用 PartialSortBy
查找并打印给定文本中最长的 5 个单词:var text = @"
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Etiam gravida nec mauris vitae sollicitudin. Suspendisse
malesuada urna eu mi suscipit fringilla. Donec ut ipsum
aliquet, tincidunt mi sed, efficitur magna. Nulla sit
amet congue diam, at posuere lectus. Praesent sit amet
libero vehicula dui commodo gravida eget a nisi. Sed
imperdiet arcu eget erat feugiat gravida id non est.
Nam malesuada nibh sit amet nisl sollicitudin vestibulum.";
var words = Regex.Matches(text, @"\w+");
var top =
from g in words.Cast<Match>()
.Select(m => m.Value)
.GroupBy(s => s.Length)
.PartialSortBy(5, m => m.Key, OrderByDirection.Descending)
select g.Key + ": " + g.Distinct().ToDelimitedString(", ");
foreach (var e in top)
Console.WriteLine(e);
14:malesuadafsfjs 12:sollicitudin 11:consectetur,Suspendisse 10:adipiscing,vestibulum 9:malesuada,fringilla,tincidunt,efficitur,imperdiet
yourResult.OrderByDescending(m => m.YourIntProperty)
.Take(3);
MaxBy
也将仅检索一个元素。
IEnumerable<T>
(你的对象列表)。我会只使用OrderByDescending(bla bla)
而不是MaxBy
。 - Raphaël Althaus