不太清楚该怎么说,但基本上,我在列表中有一堆数据,类似于这样:
Person 1
名字-乔·布洛格斯
40岁
部门-资讯科技
工资- 20,000
Person 2
姓名-杰西·简
40岁
部门-厨房
工资- 16,000
...you知道这个主意了。
目前,我已经选择了所有的人,按工资订购他们,并将他们输入一个列表框,非常简单地这样做。
var item = (from employee in employeeList.employees
orderby employee.wage descending
select employee);现在,我的问题是,我如何才能更改这段代码,使其过滤列表,只显示他们部门中收入最高的员工?例如,它不会列出数百名员工,而只会显示IT行业收入最高的员工,然后是餐饮行业收入最高的员工等等。
有可能吗?如果没有,我还可以使用其他方法来实现这一点吗?
发布于 2016-03-30 22:24:23
你可以试试这样的方法:
var result = employeeList.employees.GroupBy(emp => emp.Departemnt)
.Select(gr => new
{
Departemnt = gr.Key,
Employee = gr.OrderByDescending(x=>x.wage)
.FirstOrDefault()
});我们以上所做的是按部门分组,我们为每个部门挑选工资最高的员工。
更新
在.NET 6中,上述内容可以重写如下:
var result = employeeList.employees
.GroupBy(employee => employee.Departemnt)
.Select(gr => new
{
Departemnt = gr.Key,
Employee = gr.MaxBy(x => x.wage)
});发布于 2016-03-30 22:36:10
这种方法不需要排序就可以得到结果。所以它只需要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]) });发布于 2016-03-30 22:26:27
沿着这条线的东西:
var highSalemployeePerDept= employeeList.employees.GroupBy(x => x.Department)
.Select(g => g.OrderByDescending(x => x.Salary).First());https://stackoverflow.com/questions/36320766
复制相似问题