获取MoreLinq MaxBy函数以返回多个元素

时间:2013-10-03 15:38:58

标签: linq maxby morelinq

我有一种情况,我有一个带有int属性的对象列表,我需要检索具有该属性的最高值的3个对象。 MoreLinq MaxBy函数非常方便找到单个最高,但有没有办法可以用它找到3个最高? (不一定是相同的值)。我目前使用的实现是使用MaxBy找到单个最高,从列表中删除该对象并再次调用MaxBy等,然后在找到3个最高值后将对象添加回列表中。只考虑这个实现让我感到畏缩,我真的想找到一个更好的方法。

2 个答案:

答案 0 :(得分:2)

在这种情况下,你可以简单地做

yourResult.OrderByDescending(m => m.YourIntProperty)
.Take(3);

现在,这将检索3个对象。

因此,如果您有4个对象共享相同的值(最大值),则将跳过1。不确定这是不是你想要的,或者它不是问题...

但如果您有许多具有相同“最大值”的元素,MaxBy也只会检索一个元素。

答案 1 :(得分:0)

更新:在version 3MaxBy(包括MinBy)的MoreLINQ was changed to return a sequence而不是单个项目。

使用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