>我遇到一种情况,即我有一个带有 int 属性的对象列表,我需要检索该属性具有最高值的 3 个对象。 MoreLinq MaxBy 函数非常方便查找单个最高,但是有没有办法使用它来查找 3 个最高?(不一定具有相同的值)。 我目前使用的实现是使用 MaxBy 找到单个最高对象,从列表中删除该对象并再次调用 MaxBy 等,然后在找到 3 个最高对象后将对象添加回列表中。 光是想到这个实现就让我畏缩,我真的很想找到更好的方法。
更新:在版本 3 中,MoreLINQ 的 MaxBy
(包括MinBy
)被更改为返回序列而不是单个项目。
使用 MoreLINQ 的 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: 马苏阿达夫斯12:索利西定11:相交,悬空10:腹腔、前庭9:马来苏达,弗林吉拉,丁西顿特,有效,无常饮食
,你可以简单地做
yourResult.OrderByDescending(m => m.YourIntProperty)
.Take(3);
现在,这将检索 3 个对象。
因此,如果您有 4 个对象共享相同的值(即最大值),则将跳过 1。不确定这是否是你想要的,或者它是否不是问题......
但是,如果您有许多具有相同"最大值"的元素,MaxBy
也会只检索一个元素。