Let's say I have following data:
Name Priority A 3 A 5 B 1 C 1 C 3 C 2 I want to get list of distinct names with highest priority, so the result would look like:
Name Priority A 5 B 1 C 3 How can I use Linq to do that?
var query = yourData .GroupBy(x => x.Name, (k, g) => g.Aggregate((a, x) => (x.Priority > a.Priority) ? x : a)); // and a quick test... foreach (var result in query) { Console.WriteLine(result.Name + " " + result.Priority); } Here's an alternative approach:
var items = new List<Tuple<string, int>>() { Tuple.Create("A", 3), Tuple.Create("A", 5), Tuple.Create("B", 1), Tuple.Create("C", 1), Tuple.Create("C", 3), Tuple.Create("C", 2) }; var results = items.GroupBy(i => i.Item1) .SelectMany(g => g .Where(i => i.Item2 == g.Max(m => m.Item2))) .Distinct(); Or if you prefer using the C# LINQ syntax:
results = (from item in items group item by item.Item1 into groupedItems let maxPriority = groupedItems.Max(item => item.Item2) from element in groupedItems where element.Item2 == maxPriority select element).Distinct(); from item in items to from item in items.AsQueryable(), added results.Dump() at the end, and then looked at the "λ" panel below. It shows the query as it was translated from the query expression syntax to the regular lambda syntax. It is easier (at least for me) to evaluate complexity by looking at that. If you want to see the IL, you can, but it looks much better in C# ;)Another simple approach without aggregating
var listNP = new List<NP>() { new NP() {name="A",priority=3}, new NP() {name="A",priority=5}, new NP() {name="b",priority=1}, new NP() {name="b",priority=1}, new NP() {name="c",priority=3}, new NP() {name="c",priority=2}, }; var np = listNP.GroupBy(x => x.name).Select(y => new { name = y.Key, max = y.Max(x=>x.priority) }).ToList(); Update:
var np = listNP.GroupBy(x => x.name) .Select(y => y.OrderByDescending(z => z.priority).First()).ToList();