C# 分组数据表中的数据行
C# Group DataRows in DataTable
我有一个包含两列的 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
发送了一封附有 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);
}
我有一个包含两列的 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
发送了一封附有 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);
}