Как с помощью LINQ найти максимальное значение в группе элементов?

Помогите разобраться, есть следующий код

public class MyClass
{
   public string[] Names;
   public int Sum;
}

После этого в коде создается массив данного класса (т.е. MyClass[] myClasses) и надо выполнить следующие:
Если найдено несколько элементов внутри массива с одинаковыми Names, то для таких элементов Sum стоит учитывать только один раз: взять максимальное для группы.
Если есть несколько групп с одинаковыми Names, то суммировать Sum групп.

Пока я смог сделать только первое условие

var t = myClasses
    .GroupBy(x => x.Names)
    .Max(x => x.Select(y => y.Sum));

Как можно сделать второе условие?


Ответы (1 шт):

Автор решения: Dev18

Для группы с Names = { "A", "B" } максимальное значение = 20

Для группы с Names = { "A", "C" } максимальное значение = 40

Для группы с Names = { "B", "C" } максимальное значение = 50

Итого: ожидаем 110

public class MyClass
{
    public string[] Names;
    public int Sum;
}

class Program
{
    static void Main(string[] args)
    {
        // Создаем массив экземпляров MyClass для теста
        MyClass[] myClasses = new MyClass[]
        {
            new MyClass { Names = new string[] { "A", "B" }, Sum = 10 },
            new MyClass { Names = new string[] { "B", "A" }, Sum = 20 },
            new MyClass { Names = new string[] { "A", "C" }, Sum = 30 },
            new MyClass { Names = new string[] { "C", "A" }, Sum = 40 },
            new MyClass { Names = new string[] { "B", "C" }, Sum = 50 }
        };

        // Группировка, сортировка Names, нахождение максимума в группе и суммирование максимальных значений
        var result = myClasses
            .GroupBy(x => string.Join(",", x.Names.OrderBy(name => name))) // Сортировка элементов внутри массива Names
            .Select(g => g.Max(x => x.Sum))
            .Sum();

        // Вывод результата на консоль
        Console.WriteLine("Result: " + result);
    }
}

OrderBy гарантирует, что массивы с одинаковыми элементами, но в разном порядке (например, ["A", "B"] и ["B", "A"]), будут считаться одинаковыми при группировке

a) GroupBy, чтобы сгруппировать объекты MyClass по полю Names

b) Для каждой группы, используем Max, чтобы выбрать максимальное значение Sum

c) После того как максимальные значения выбраны для каждой группы, используем Sum, чтобы получить суммарное значение этих максимальных значений

console : Result: 110

→ Ссылка