使MoreLinq的MaxBy函数返回多个元素

3
我有这样一种情况:我有一个对象列表,其中包含一个int属性,我需要找出该属性值最高的3个对象。MoreLinq MaxBy函数非常方便地查找单个最高值,但是否有办法使用该函数查找前三个最高值?(不一定是相同的值)。我目前正在使用的实现方式是使用MaxBy查找单个最高值,从列表中删除该对象并再次调用MaxBy,以此类推,直到找到三个最高值为止,然后将对象添加回列表。仅想到这种实现方式就让我感到不舒服,我真的很想找到更好的方法。
2个回答

2
更新:在版本3中,MoreLINQ的MaxBy(包括MinBy)被更改为返回一个序列而不是单个项。
使用 MoreLINQ 的 PartialSortPartialSortBy。下面的示例使用 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

1
在这种情况下,你可以简单地执行以下操作。
yourResult.OrderByDescending(m => m.YourIntProperty)
.Take(3);

现在,这将为您检索3个对象。
因此,如果您有4个共享相同值(即最大值)的对象,则会跳过1个。不确定这是否是您想要的,或者是否存在问题...
但是,如果您有许多具有相同“最大值”的元素,MaxBy也将仅检索一个元素。

在这种情况下,“yourResult”是什么?这是在我使用MaxBy之后吗,还是完全不同的实现? - Fenoec
好的,这是你的IEnumerable<T>(你的对象列表)。我会只使用OrderByDescending(bla bla)而不是MaxBy - Raphaël Althaus
我把它变得比必要的复杂了很多 ;) 谢谢解决方案,完美运行。 - Fenoec
这个方法是可行的,但不如@Atif Aziz提供的答案高效,因为它对列表进行了完全排序,而PartialSort则做了更少的工作。 - Hugh W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接