2016-04-29 16 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。你能幫我做到嗎? –

相關問題