Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ选择每个部门收入最高的员工_C#_Linq - Fatal编程技术网

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

C# 使用LINQ选择每个部门收入最高的员工,c#,linq,C#,Linq,我不太确定如何用词,但基本上我在一个列表中有一堆数据,类似于: 第1人 姓名-乔·布洛格斯 年龄-40岁 部门-IT 工资-20000 第二人 姓名-杰西·简 年龄-40岁 部门-厨房 工资-16000 …你明白了 目前,我只是选择了所有的人,按工资排序,然后简单地将他们输入列表框 var item = (from employee in employeeList.employees orderby employee.wage descending select employee); 现在,我

我不太确定如何用词,但基本上我在一个列表中有一堆数据,类似于:

第1人

姓名-乔·布洛格斯
年龄-40岁
部门-IT
工资-20000

第二人

姓名-杰西·简
年龄-40岁
部门-厨房
工资-16000

…你明白了

目前,我只是选择了所有的人,按工资排序,然后简单地将他们输入列表框

var item = (from employee in employeeList.employees
orderby employee.wage descending
select employee);
现在,我的问题是,我如何修改这段代码,使其在列表中过滤,只显示他们部门中收入最高的员工?例如,它不会列出数百名员工,而是只显示其中收入最高的员工,然后是餐饮业收入最高的员工,等等


可能吗?如果没有其他方法,我可以使用吗?

您可以尝试以下方法:

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

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

大致如下:

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

这种方法让您无需排序即可获得结果。所以只需要O(n)个时间,而不是O(n*log(n))

编辑:更优化的版本是:

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