2016-03-30 9 views
1

Nicht wirklich sicher, wie man Wort es aber im Grunde habe ich eine Reihe von Daten in einer Liste, die in etwa so geht:LINQ zu bestbezahlte Mitarbeiter auswählen pro Abteilung

Person 1

Name - Joe Bloggs
Alter - 40
Abteilung - IT
Lohn - 20.000

Person 2

Name - Jess Jane
Alter - 40
Abteilung - Küche
Lohn - 16.000

... Sie auf die Idee.

Im Moment habe ich gerade alle Leute ausgewählt, sie nach Lohn sortiert und sie einfach in eine Listbox eingetragen, indem ich das getan habe.

var item = (from employee in employeeList.employees 
orderby employee.wage descending 
select employee); 

Nun, meine Frage ist, wie kann ich dieses Stück Code ändern, so dass es in der Liste Filter durch und zeige nur die höchsten Verdienst Mitarbeiter in ihrer Abteilung? Anstatt beispielsweise Hunderte von Mitarbeitern zu nennen, wird nur der am höchsten verdienende Mitarbeiter in der IT angezeigt, dann der am höchsten verdienende Mitarbeiter in der Gastronomie usw.

Ist es möglich? Wenn nicht gibt es andere Methoden, die ich verwenden kann, um dies zu erreichen?

Antwort

2

Man könnte so etwas wie dies versuchen:

var result = employeeList.employees.GroupBy(emp=>emp.Departemnt) 
            .Select(gr=> new 
            { 
             Departemnt = gr.Key, 
             Employee = gr.OrderByDescending(x=>x.wage) 
                .FirstOrDefault() 
            }); 

Dass wir oben tun eine Gruppierung von Abteilung ist und die wir für jede Abteilung die Mitarbeiter mit dem höchsten Lohn holen.

0

etwas in dieser Linie:

var highSalemployeePerDept= employeeList.employees.GroupBy(x => x.Department) 
       .Select(g => g.OrderByDescending(x => x.Salary).First()); 
0
var highestEarnersByDept = 
      employeeList.employees.GroupBy(employee => employee.Department) 
       .Select(grouping => grouping.OrderByDescending(employee => employee.Wage).First()) 
       .ToArray(); 
0

Dieser Ansatz lässt Sie das Ergebnis ohne Bestellung erhalten. So dauert es nur O (n) Zeit statt O (n * log (n))

var highestEarningPersonByDepartment = persons 
    .GroupBy(p => p.Department) 
    .Select(g => new { Department = g.Key, HighestEarningPerson = g.First(person => person.Wage == g.Max(p => p.Wage)) }) 
    .ToDictionary(dp => dp.Department, dp => dp.HighestEarningPerson); 

Edit: Eine optimierte Version wäre:

var maxWageByDepartment = persons 
    .GroupBy(p => p.Department) 
    .ToDictionary(g => g.Key, g => g.Max(p => p.Wage)); 

var richestPersonByDepartment = persons 
    .GroupBy(p => p.Department) 
    .Select(g => new { Department = g.Key, HighestEarningPerson = g.First(person => person.Wage == maxWageByDepartment[g.Key]) });