将多个列表合并为一个,按特定列分组,将每个分组结果转换为HTML表

问题描述

我正在研究一种将向每个用户发送电子邮件方法我有几个列表,我在其中收集有关应修复的项目的信息。之后,我将按用户分组,并希望向他们每个人发送电子邮件以采取一些措施。

这是我当前的代码

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

                    }
                }

            }

        }