我有一个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()
组合在一起
答案 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);
}