问题描述
我正在研究一种将向每个用户发送电子邮件的方法。我有几个列表,我在其中收集有关应修复的项目的信息。之后,我将按用户分组,并希望向他们每个人发送电子邮件以采取一些措施。
这是我当前的代码:
public static void SendEmail()
{
string HTMLTableInString = "";
string PM = "";
var combined = List1
.Concat(List2)
.Concat(List3)
.Concat(List4)
.Concat(List5)
.Concat(List6)
.Concat(List7)
.Concat(List8)
.ToList();
if (combined.Any())
{
var GroupedList = combined.GroupBy(x => x.User)
.Select(grp => grp.ToList())
.ToList();
foreach (var item in GroupedList)
{
foreach (var pos in item)
{
HTMLTableInString = Other.CreateHTMLTable(GroupedList,x => (pos.ProjectNumber,"Project number"),x => (pos.SubProjectNumber,"Sub-project number"),x => (pos.SubProjName,"Sub-project name"),x => (pos.User,"User")
);
Console.WriteLine(pos.ProjectNumber + " " + pos.SubProjName + " " + pos.User);
PM = pos.User;
}
if (!string.IsNullOrWhiteSpace(PM))
{
Console.WriteLine("-------------------------------------------------------------");
Console.WriteLine(HTMLTableInString);
Console.WriteLine("-------------------------------------------------------------");
// Send an email
}
}
}
}
当前此行产生预期的结果
Console.WriteLine(pos.ProjectNumber + " " + pos.SubProjName + " " + pos.User);
但是我的HTML表看起来不正确,行数是正确的,但是它们都具有相同的值。这是因为HTMLTableInString
被多次覆盖(取决于用户记录)。我知道问题出在哪里,但我无法找到正确的解决方案。有什么建议吗?
CreateHTMLTable是一种用于将列表转换为字符串(= HTML表)的方法。
public static string CreateHTMLTable<T>(IEnumerable<T> list,params Func<T,(object,string)>[] fxns) // Used for generating HTML table
{
var sb = new StringBuilder();
sb.Append("<table>\n");
sb.Append("<thead>\n");
sb.Append("<tr>\n");
foreach (var fxn in fxns)
sb.Append("<th>").Append(fxn(default).Item2).AppendLine("</th>");
sb.Append("</tr>\n");
sb.Append("</thead>\n");
foreach (var item in list)
{
sb.Append("<tr>\n");
foreach (var fxn in fxns)
{
sb.Append("<td>");
sb.Append(fxn(item).Item1);
sb.Append("</td>");
}
sb.Append("\n</tr>\n");
}
sb.Append("</table>");
return sb.ToString();
}
解决方法
我已经弄清楚了,尽管我不知道这是最好的解决方案。我添加了一个要创建的“中间”列表,并将其写入/循环清空。
public static void SendEmail()
{
string HTMLTableInString = "";
string PM = "";
List<ListDefaultStructure> ListForEmailTable = new List<ListDefaultStructure>();
var combined = List1
.Concat(List2)
.Concat(List3)
.Concat(List4)
.Concat(List5)
.Concat(List6)
.Concat(List7)
.Concat(List8)
.ToList();
if (combined.Any())
{
var GroupedList = combined.GroupBy(x => x.User)
.Select(grp => grp.ToList())
.ToList();
foreach (var item in GroupedList)
{
foreach (var pos in item)
{
ListForEmailTable.Add(new ListDefaultStructure
{
ProjectNumber = pos?.ProjectNumber,SubProjectNumber = pos?.SubProjectNumber,SubProjectName = pos?.SubProjectName,User = pos?.User
});
PM = pos.User;
}
if (!string.IsNullOrWhiteSpace(PM))
{
HTMLTableInString = Other.CreateHTMLTable(GroupedList,x => (pos.ProjectNumber,"Project number"),x => (pos.SubProjectNumber,"Sub-project number"),x => (pos.SubProjName,"Sub-project name"),x => (pos.User,"User")
);
Console.WriteLine("-------------------------------------------------------------");
Console.WriteLine(HTMLTableInString);
Console.WriteLine("-------------------------------------------------------------");
// Send an email
}
}
}
}