1

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

4

2 回答 2

2

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

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

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

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

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

于 2013-10-03T15:40:58.210 回答
1

更新:版本 3中,MaxBy(包括MinBy)的 MoreLINQ已更改为返回一个序列,而不是单个项目。

使用 MoreLINQPartialSortPartialSortBy. 下面的示例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:consectetur,暂停
10:脂肪,前庭
9:malesuada, fringilla, tincidunt, efficitur, imperdiet
于 2018-05-25T07:24:39.210 回答