【问题标题】:How to group by all employees with same manager in a list using c#?如何使用 c# 在列表中按具有相同经理的所有员工分组?
【发布时间】:2016-08-24 01:46:40
【问题描述】:

我有一个列表,其中包含员工的详细信息(他们的姓名、电子邮件)和他们向其报告的经理的电子邮件。 例如。列表 EmpD

  1. abcd | abcd@gmail.com | abcdmgr@gmail.com
  2. pqr | pqr@gmail.com | pqrmgr@gmail.com
  3. pqrs | pqrs@gmail.com | pqrmgr@gmail.com

现在,我需要向每位员工以及经理发送邮件,邮件正文中包含他手下所有员工的姓名。

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

上述方法运行良好,但我想对其进行优化。目前,相同的循环被遍历了两次,尽管我必须创建另一个新列表来存储类似类型的数据。 有没有办法将所有员工分组在同一个经理下,也许是通过 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

【问题讨论】:

标签: c# linq list loops


【解决方案1】:

您可以通过Emp_reportingToList&lt;Employee&gt; 执行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);
}

【讨论】:

  • 它仍然需要创建新列表。我尝试了一些方法:“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。你能帮我做吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多