MaxBy() есть ли способ получить несколько максимальных значений?

Я пытаюсь получить максимальные значения из списка, но если есть несколько максимальных значений, я хочу получить все максимальные значения.

Например, у меня есть: Имя1, 31 Имя2, 35 Имя3, 33 Имя4, 35

И я хочу получить: {Имя2, 35} И {Имя4, 35}

Я попытался использовать MaxBy();

Но это возвращает только 1-й элемент (Name2, 35) Любая помощь будет оценена

struct Amounts
{
    public string Name;
    public int Total;
}

Amount highestAmount = amounts.MaxBy(x => x.Total);

amounts.GroupBy(x => x.Total).MaxBy(g => g.Key)
Alexander Petrov 20.11.2022 14:05
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Топ-10 компаний-разработчиков PHP
Топ-10 компаний-разработчиков PHP
Если вы ищете надежных разработчиков PHP рядом с вами, вот список лучших компаний по разработке PHP.
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Улучшение генерации файлов Angular
Улучшение генерации файлов Angular
Angular - это фреймворк. Вы можете создать практически любое приложение без использования сторонних библиотек.
1
1
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это, сначала используя GroupBy , а затем используя MaxBy для каждой клавиши. Вот метод расширения:

public static IEnumerable<TSource> MaxsBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource,TKey> keySelector)
{
    return source.GroupBy(keySelector).MaxBy(g => g.Key);
}

Вот рабочая демка:

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    struct Amounts
    {
        public string Name;
        public int Total;
    }

    public static void Main()
    {
        var amounts = new List<Amounts>
        {
            new Amounts { Name = "Name1", Total = 31 },
            new Amounts { Name = "Name2", Total = 35 },
            new Amounts { Name = "Name3", Total = 32 },
            new Amounts { Name = "Name4", Total = 35 }
        };
        var results = amounts.MaxsBy(x => x.Total);
        Console.WriteLine(string.Join("\n", results.Select(x => x.Name)));
    }
}

public static class Extensions 
{
    public static IEnumerable<TSource> MaxsBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource,TKey> keySelector)
    {
        return source.GroupBy(keySelector).MaxBy(g => g.Key);
    }
}

Вывод

Name2
Name4

Другие вопросы по теме