让 MoreLinq MaxBy 函数返回多个元素

2024-03-05

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


Update: In 版本3 https://github.com/morelinq/MoreLINQ/releases/tag/v3.0.0, MaxBy https://morelinq.github.io/3.0/ref/api/html/Overload_MoreLinq_MoreEnumerable_MaxBy.htm(包括MinBy https://morelinq.github.io/3.0/ref/api/html/Overload_MoreLinq_MoreEnumerable_MinBy.htm)的MoreLINQ更改为返回序列 https://github.com/morelinq/MoreLINQ/issues/328而不是单个项目。

使用 MoreLINQPartialSort https://morelinq.github.io/2.0/ref/api/html/Overload_MoreLinq_MoreEnumerable_PartialSort.htm or PartialSortBy https://morelinq.github.io/2.0/ref/api/html/Overload_MoreLinq_MoreEnumerable_PartialSortBy.htm。下面的例子使用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
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 MoreLinq MaxBy 函数返回多个元素 的相关文章

随机推荐