看下面的例子.在这里,员工ID = 2,也就是史蒂夫有3个重复项.
我只希望每个ID有一个记录.我想选择薪水第二高的记录.因此,在史蒂夫(Steve)的情况下,将选择两个史蒂夫(Steve)帽子之一,薪水为160.
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
public int Salary { get; set; }
public static List<Employee> GetAllEmployees()
{
return new List<Employee>()
{
new Employee { ID = 1, Name = "Mark", Salary = 100 },
new Employee { ID = 2, Name = "Steve", Salary = 150 },
new Employee { ID = 2, Name = "Steve", Salary = 160 },
new Employee { ID = 2, Name = "Steve", Salary = 160 },
new Employee { ID = 2, Name = "Steve", Salary = 165 },
new Employee { ID = 3, Name = "Ben", Salary = 140 }
};
}
}
所需输出:
1 Mark 100
1 Steve 160 //2nd highest salary of steve( there are two such steves so pick any)
1 Mark 100
1 Ben 140
我知道如何基于属性获取不同的记录:
var result = Employee.GetAllEmployees().GroupBy(x=>x.ID).Distinct();
但另一方面,我迷路了.
请注意,我仅在寻找LINQ lambda / extension语法答案.谢谢!
解决方法:
一种方法是在GroupBy之后使用Select.这将把每个小组变成一个雇员.
Employee.GetAllEmployees().GroupBy(x=>x.ID).Select(x => FindSecondHighest(x));
FindSecondHighest应该是这样的:
private static Employee FindSecondHighest(IEnumerable<Employee> employees) {
var list = employees.ToList();
if (list.Count == 1) { return list[0]; }
return list.OrderByDescending(x => x.Salary).Skip(1).First();
}
您可以根据需要将方法重写为lambda,但我觉得这种方法更具可读性.
编辑:
我意识到,如果有两个最高薪水,这实际上并不会获得第二高薪水.要实际获得第二高的薪水,您可以使用第二个GroupBy:
private static Employee FindSecondHighest(IEnumerable<Employee> employees) {
var list = employees.ToList();
if (list.Count == 1) { return list[0]; }
return list.GroupBy(x => x.Salary).OrderByDescending(x => x.Key).Skip(1).First();
}
标签:linq,c,net 来源: https://codeday.me/bug/20191024/1922862.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。