不确定如何说出来,但基本上我在列表中有一堆数据与此类似:
第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中收入最高的员工,然后是餐饮业中收入最高的员工等。
有可能吗?如果没有,我可以使用任何其他方法来实现这一目标吗?
答案 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]) });