首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用LINQ选择每个部门收入最高的员工

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

Stack Overflow用户
提问于 2016-03-30 22:20:14
回答 4查看 6.3K关注 0票数 5

不太清楚该怎么说,但基本上,我在列表中有一堆数据,类似于这样:

Person 1

名字-乔·布洛格斯

40岁

部门-资讯科技

工资- 20,000

Person 2

姓名-杰西·简

40岁

部门-厨房

工资- 16,000

...you知道这个主意了。

目前,我已经选择了所有的人,按工资订购他们,并将他们输入一个列表框,非常简单地这样做。

代码语言:javascript
运行
复制
var item = (from employee in employeeList.employees
orderby employee.wage descending
select employee);

现在,我的问题是,我如何才能更改这段代码,使其过滤列表,只显示他们部门中收入最高的员工?例如,它不会列出数百名员工,而只会显示IT行业收入最高的员工,然后是餐饮行业收入最高的员工等等。

有可能吗?如果没有,我还可以使用其他方法来实现这一点吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-03-30 22:24:23

你可以试试这样的方法:

代码语言:javascript
运行
复制
var result =  employeeList.employees.GroupBy(emp => emp.Departemnt)
                                    .Select(gr => new 
                                    { 
                                        Departemnt = gr.Key, 
                                        Employee = gr.OrderByDescending(x=>x.wage)
                                                     .FirstOrDefault() 
                                    });

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

更新

在.NET 6中,上述内容可以重写如下:

代码语言:javascript
运行
复制
var result =  employeeList.employees
                          .GroupBy(employee => employee.Departemnt)
                          .Select(gr => new 
                          { 
                              Departemnt = gr.Key, 
                              Employee = gr.MaxBy(x => x.wage) 
                          });
票数 6
EN

Stack Overflow用户

发布于 2016-03-30 22:36:10

这种方法不需要排序就可以得到结果。所以它只需要O(n)时间,而不是O(n*log(n))

代码语言:javascript
运行
复制
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);

编辑:一个更优化的版本是:

代码语言:javascript
运行
复制
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]) });
票数 1
EN

Stack Overflow用户

发布于 2016-03-30 22:26:27

沿着这条线的东西:

代码语言:javascript
运行
复制
var highSalemployeePerDept= employeeList.employees.GroupBy(x => x.Department)
                 .Select(g => g.OrderByDescending(x => x.Salary).First());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36320766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档