如何使用与谓词相同的集合中的值来从集合中获取汇总值

时间:2018-09-20 01:52:07

标签: c#

我有一个包含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计数。

2 个答案:

答案 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() 
   });