2016-05-23 55 views
0

我有两个DataTable列:File & EmailC#组数据行DataTable中

C://file1.jpg [email protected] 
C://file2.jpg [email protected] 
C://file3.jpg [email protected] 
C://file4.jpg [email protected] 
C://file5.jpg [email protected] 

在通过DataRow是我的代码,我环路和发送电子邮件至Email附带File

问题:

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

所以上面DataTable将导致3封电子邮件:

file1,file2 sent to [email protected] 
file3,file5 sent to [email protected] 
file4 sent to [email protected] 

我的代码示例:

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

我能通过一个StringCollection或数组我SendEmailWithAttachments()函数,那么循环throught它,重视所有的文件,但我如何将这些DataRow s排在第一位

+0

什么[GroupBy](https://msdn.microsoft.com/en-us/library/bb534304(v = vs.100).aspx)电子邮件? – Pikoh

+2

可能首先要做的是改变_SendEmailWithAttachments_接受一个列表'与当前电子邮件的文件名 – Steve

回答

2

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

当然,你也需要改变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

您可以通过电子邮件使用的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", "[email protected]"}; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 

     dr.ItemArray=new object[2]{"C://file2.jpg", "[email protected]"}; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr.ItemArray=new object[2]{"C://file3.jpg", "[email protected]"}; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr.ItemArray=new object[2]{"C://file4.jpg", "[email protected]"}; 
     dt.Rows.Add(dr); 
     dr = dt.NewRow(); 
     dr.ItemArray=new object[2]{"C://file5.jpg", "[email protected]"}; 
     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); 
     }