2016-04-29 45 views
0

我有一个列表,其中包含员工的详细信息(他们的姓名,电子邮件)以及他们向其报告的经理的电子邮件。例如,列表<> EmpD如何使用c#在列表中使用同一位经理进行分组?

  1. abcd | [email protected] | [email protected]
  2. pqr | [email protected] | [email protected]
  3. pqrs | [email protected] | [email protected]

现在,我需要发送邮件给每个员工,也发送给经理与邮件正文包含他下的所有员工的名字。

为此,我使用了两个循环。 一个获取经理电子邮件和其他来检查经理电子邮件是否与我们从第一个循环获得的电子邮件匹配。如果是的话,我发送邮件给这些员工,并将他们添加到另一个新的员工名单。第二次循环完成后,我有该经理下的所有员工名单。所以现在我给他发送邮件,还有这个新名单。 现在第一个循环进入第二次迭代并重复。

上述方式工作正常,但我想优化它。目前,同一个循环遍历两次,尽管如此我还是要创建另一个新列表来存储相似类型的数据。 有没有办法将同一位经理下的所有员工分组,也许通过Linq(我是新手)?

我的代码:

int countemp = 0; 
while (countemp < listemp.Count()) 
{ 
     var l = listemp[countemp]; 
     List<EmpRecord> empR = new List<EmpRecord>(); 

     foreach (var e in listemp) 
     { 
      if (l.Emp_reportingTo == e.Emp_reportingTo) 
      { 
          empR.Add(new EmpRecord() { Emp_Name = e.Emp_Name, EmpIn_Time = e.EmpIn_Time }); 
          SendMailEmp(e.Emp_Name,e.Emp_MailID);      //Send mail to Employee 
          countemp++; 
      } 
     } 
     SendMailMngr(l.Emp_reportingTo, empR);     //Send mail to Manager 
} 

编辑: 随着提供建议帮助下,我曾尝试另一个代码:

var results = from p in listemp 
     group p.Emp_Name by p.Emp_reportingTo into g 
     select new { Emp_reportingTo = g.Key, empR = g.ToList() }; 

它工作正常。但是,我只能在这里获取一列(Emp_Name)。我如何获得另一列,说Emp_InTime呢?

+2

[通过在LINQ组]的可能的复制(http://stackoverflow.com/questions/7325278/group-by-in-linq) –

+0

在C++'的std ::地图<串,向量> '首先'字符串'是经理名字,'矢量'是他的雇员。在c#中相当于C++'std :: map'在这里http://stackoverflow.com/questions/21183414/what-is-c-sharp-equivalent-of-map-in-c –

回答

0

您可以通过Emp_reportingToList<Employee>执行GroupBy,然后像这样循环分组结果。

var listemp = new List<Employee>(); 
var groupedEmpByMgr = listemp.GroupBy(x => x.Emp_reportingTo); 

foreach (var empsByMgr in groupedEmpByMgr) 
{ 
    var empR = new List<EmpRecord>(); 

    foreach (var emp in empsByMgr) 
    { 
     empR.Add(new EmpRecord() { Emp_Name = emp.Emp_Name, EmpIn_Time = emp.EmpIn_Time }); 
     SendMailEmp(emp.Emp_Name, emp.Emp_MailID); 
    } 

    SendMailMngr(empsByMgr.Key, empR); 
} 
+0

它仍然需要创建新列表。我尝试了一些东西:“var results = from p in listemp group p.Emp_Name by p.Emp_reportingTo into g select new {Emp_reportingTo = g.Key,empR = g.ToList()};”但是我无法获取多个列(Emp_Name)使用此。我也想Emp_MailId。你能帮我做到吗? –

相关问题