C# 分组数据表中的数据行

C# Group DataRows in DataTable

我有一个包含两列的 DataTableFile & Email

C://file1.jpg aaa@gmail.com  
C://file2.jpg aaa@gmail.com  
C://file3.jpg bbb@gmail.com  
C://file4.jpg ccc@gmail.com  
C://file5.jpg bbb@gmail.com

在我的代码中,我循环遍历了 DataRow 并向 Email 发送了一封附有 File 的电子邮件。

问题:

我需要以某种方式检查是否有任何其他 DataRow 具有相同的 Email,如果有,只发送一封包含多个附件的电子邮件。

所以上面的 DataTable 会产生 3 封电子邮件:

file1,file2 sent to aaa@gmail.com  
file3,file5 sent to bbb@gmail.com  
file4 sent to ccc@gmail.com

我的代码示例:

foreach (DataRow row in dt.Rows) {
     string file = row[0].ToString();
     string email = row[1].ToString();
     SendEmailWithAttachments(email,file);
}

我可以将 StringCollection 或数组传递给我的 SendEmailWithAttachments() 函数,然后遍历它并附加所有文件,但我如何首先将这些 DataRow 分组

使用 GroupBy Linq 扩展,您可以处理您的 DataRows,将它们分组到电子邮件字段,然后 foreach 创建一个包含文件名的字符串列表。

当然,您还需要更改 SendMailWithAttachments 以接收作为第二个参数的 List<string> 而不是单个字符串

var g = dt.AsEnumerable().GroupBy(d => d.Field<string>("Email"));
foreach (var x in g)
{
    List<string> files = new List<string>();
    foreach (var z in x)
        files.Add(z.Field<string>("File"));

    SendEmailWithAttachments(email,files);

}

您可以使用 GroupBy 按电子邮件分组:

        DataTable dt = new DataTable();
        dt.Columns.Add("Path");
        dt.Columns.Add("Email");
        DataRow dr = dt.NewRow();
        dr.ItemArray=new object[2]{"C://file1.jpg", "aaa@gmail.com"};
        dt.Rows.Add(dr);
        dr = dt.NewRow();

        dr.ItemArray=new object[2]{"C://file2.jpg", "aaa@gmail.com"};
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr.ItemArray=new object[2]{"C://file3.jpg", "bbb@gmail.com"};
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr.ItemArray=new object[2]{"C://file4.jpg", "ccc@gmail.com"};
        dt.Rows.Add(dr);
        dr = dt.NewRow();
        dr.ItemArray=new object[2]{"C://file5.jpg", "bbb@gmail.com"};
        dt.Rows.Add(dr);


        var grouped=dt.AsEnumerable().GroupBy(x=>x.Field<string>("Email"));

        foreach (var mail in grouped)
        {
            List<string> filesForEmail = new List<string>();
            foreach (var file in mail)
            {
                filesForEmail.Add(file.Field<string>("Path"));
            }

            SendEmailWithAttachments(mail.Key, filesForEmail);
        }