C#在DataTable中对DataRows进行分组

时间:2016-05-23 15:45:06

标签: c# email datatable datarow

我有一个DataTable,其中有两列:File& 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的{​​{1}}。

问题:

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

因此上述Email会产生3封电子邮件:

DataTable

我的代码示例:

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()组合在一起

2 个答案:

答案 0 :(得分:2)

使用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);

}

答案 1 :(得分:1)

您可以使用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);
        }