我有一个包含Employee Model Objects
的列表。
public List<EmployeeModel> EmployeeData()
{
return new List<EmployeeModel>()
{
new EmployeeModel(){ EmpID = 1, EmpSSN = 11, LName = "Motor", FName = "Mouse" },
new EmployeeModel(){ EmpID = 2, EmpSSN = 11, LName = "Motor", FName = "Mouse" },
new EmployeeModel(){ EmpID = 3, EmpSSN = 11, LName = "Motor", FName = "Mouse" },
new EmployeeModel(){ EmpID = 1, EmpSSN = 12, LName = "Cat", FName = "Auto" },
new EmployeeModel(){ EmpID = 2, EmpSSN = 12, LName = "Cat", FName = "Auto" },
};
}
我需要列出每个雇员及其在EmpSSN中发生的总数,以便输出看起来像这样:
Last Name: Mouse. Total EmpSSN: 3
Last Name: Cat. Total EmpSSN: 2
我可以做这样的事情来获取名字:
var name = data.EmployeeData().Select(x => x.LastName).Distinct();
但是,由于我不知道列表中的数据或没有要传递的参数,我不确定如何在不编写外部代码或两次使用同一列表的情况下获取EmpSSN计数。
答案 0 :(得分:2)
使用Distinct
而不是使用GroupBy
:
var name = data.EmployeeData()
.GroupBy(x => x.LastName)
.Select(g => new {
LastName = g.Key
, TotalEmpSsn = g.Count()
});
由于将LastName
用作组的键,因此Select
将合并具有相同姓氏的记录的组。如果您希望在组中将特定谓词为真的项(例如,EmpSsn
高于某个数字,等等),则可以将该谓词提供给Count()
方法。
答案 1 :(得分:1)
我先按姓氏将它们分组,然后像这样对EmpSSN调用Sum():
var data = EmployeeData()
.GroupBy(e => e.LastName)
.Select(e => new {
EmpID = e.Key,
EmpSSN = e.Select(emp => emp.EmpSSN).Sum()
});