Я пытаюсь получить максимальные значения из списка, но если есть несколько максимальных значений, я хочу получить все максимальные значения.
Например, у меня есть: Имя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);
Вы можете сделать это, сначала используя 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
amounts.GroupBy(x => x.Total).MaxBy(g => g.Key)