query framework examples c# linq

framework - linq query in c#



Cómo diferenciarse con el valor más alto usando Linq (3)

Digamos que tengo los siguientes datos:

Name Priority A 3 A 5 B 1 C 1 C 3 C 2

Quiero obtener una lista de nombres distintos con la prioridad más alta, para que el resultado se vea como:

Name Priority A 5 B 1 C 3

¿Cómo puedo usar Linq para hacer eso?


Aquí hay un enfoque alternativo :

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();

O si prefieres usar la sintaxis de C # LINQ:

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();


Otro enfoque simple sin agregar

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();

Actualizar:

var np = listNP.GroupBy(x => x.name) .Select(y => y.OrderByDescending(z => z.priority).First()).ToList();


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); }