С# группировать DataRows в DataTable

У меня есть DataTable с двумя столбцами: File и Email

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 с таким же 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(), а затем пройтись по ней и прикрепить все файлы, но как мне сгруппировать эти DataRow в первую очередь?


person Gintas K    schedule 23.05.2016    source источник
comment
Как насчет электронной почты GroupBy?   -  person Pikoh    schedule 23.05.2016
comment
Вероятно, первое, что нужно сделать, это изменить этот SendEmailWithAttachments, чтобы он принимал List<string> с именами файлов для текущего электронного письма.   -  person Steve    schedule 23.05.2016


Ответы (2)


Используя расширение Linq GroupBy, вы можете обрабатывать ваши 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);

}
person Steve    schedule 23.05.2016

Вы можете использовать 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);
        }
person Pikoh    schedule 23.05.2016