使用LINQ选择每个部门的最高收入员工

时间:2016-03-30 22:20:15

标签: c# linq

不确定如何说出来,但基本上我在列表中有一堆数据与此类似:

第1人

姓名 - Joe Bloggs
年龄 - 40岁 部门 - IT
工资 - 20,000

第2人

姓名 - Jess Jane
年龄 - 40岁 部门 - 厨房
工资 - 16,000

......你明白了。

目前,我刚刚选择了所有人,按工资对他们进行了排序,并将其简单地输入到列表框中。

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

现在,我的问题是,如何更改这些代码,以便它在列表中进行过滤并仅显示其部门中收入最高的员工?因此,例如,不会列出数百名员工,而只会显示IT中收入最高的员工,然后是餐饮业中收入最高的员工等。

有可能吗?如果没有,我可以使用任何其他方法来实现这一目标吗?

4 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

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

我们上面所做的是按部门分组,我们为每个部门选择工资最高的员工。

答案 1 :(得分:0)

沿着这条线的东西:

var highSalemployeePerDept= employeeList.employees.GroupBy(x => x.Department)
                 .Select(g => g.OrderByDescending(x => x.Salary).First());

答案 2 :(得分:0)

var highestEarnersByDept =
            employeeList.employees.GroupBy(employee => employee.Department)
                .Select(grouping => grouping.OrderByDescending(employee => employee.Wage).First())
                .ToArray();

答案 3 :(得分:0)

此方法可让您无需订购即可获得结果。所以它只需要O(n)时间而不是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);

编辑:更优化的版本是:

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