我有一个列表,其中包含员工的详细信息(他们的姓名,电子邮件)以及他们要报告的经理的电子邮件。 例如。列表与LT;> EMPD
现在,我需要向每位员工以及邮件正文发送邮件,邮件正文中包含他下所有员工的姓名。
为此,我使用了两个循环。 一个是获取经理电子邮件,另一个是检查经理电子邮件是否与我们从第一个循环获得的电子邮件匹配。如果是,我会向这些员工发送邮件并将其添加到另一个新的员工列表中。第二个循环完成后,我有该经理下的所有员工的列表。所以现在我用这个新名单给他发邮件。 现在,第一个循环进入第二次迭代并重复。
以上方式工作正常,但我想优化它。目前,相同的循环被遍历两次,尽管我必须创建另一个新列表来存储类似类型的数据。 有没有办法将所有员工归入同一经理,也许是通过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 ?
答案 0 :(得分:0)
您可以GroupBy
在List<Employee>
上Emp_reportingTo
进行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);
}
,然后像这样循环分组结果。
<script type="text/javascript">
<!--
function redirectlink(text){
window.location = "index.php?keyName="+ text;
}
//-->
</script>
<form>
<button type="button" id="butt_1" onclick="redirectlink(KEY_POWER)"> 1 </button>