-2

好的,我的 linq 技能不是很好,所以我尝试执行以下操作。

假设我有 6000 条记录(电子邮件地址)我想将前 1000 条添加到密件抄送,发送,接下来的 1000 条添加到密件抄送,发送,将 1000 条添加到密件抄送,发送等....

开始写了,

string[] files = System.IO.Directory.GetFiles(@"C:\Mail\ ", "*.csv");

Parallel.ForEach(files, currentFile =>
{
    string filename = currentFile;
    StreamReader reader = new StreamReader(filename);
    var emailList = new List<String>();
    while (reader.Peek() >= 0)
    {
        emailList.Add(reader.ReadLine());
    }
    \\Here is where I need to do the linq?
    IEnumerable<string> list = emailList

    var message = new System.Net.Mail.MailMessage();
    foreach (var s in list)
    {
        MailAddress mailAddress = new MailAddress(s);
        message.Bcc.Add(mailAddress);
    }

    message.Subject = txtSubject.Text;
    message.From = new System.Net.Mail.MailAddress(txtFrom.Text);
    message.Body = txtMessage.Text;
    message.IsBodyHtml = true;
    var smtp = new System.Net.Mail.SmtpClient();

    smtp.Send(message);
4

3 回答 3

6

你似乎在寻找一种Batch方法。这是一种实现:

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    List<T> buffer = new List<T>(batchSize);

    foreach (T item in source)
    {
        buffer.Add(item);

        if (buffer.Count >= batchSize)
        {
            yield return buffer;
            buffer = new List<T>(batchSize);
        }
    }
    if (buffer.Count > 0)
    {
        yield return buffer;
    }
}

你现在可以写:

foreach(var batch in emailList.Batch(1000))
{
    var message = CreateMessage();
    foreach(var email in batch)
    {
        message.Bcc.Add(email);
    }
    message.Send();
}

附带说明一下,您可以使用 a来获取表示文件中的行,而不是使用 aStreamReader来读取文件的行。它甚至具有流式传输数据而不是先将所有行拉入内存的附带好处。File.ReadLinesIEnumerable<string>

于 2013-10-14T14:33:23.447 回答
1

将您的电子邮件发送代码移动到一个单独的方法中,并在初始 while 循环中有足够的地址后调用它:

var emailList = new List<String>();
while (reader.Peek() >= 0)
{
    emailList.Add(reader.ReadLine());
    if(emailList.Count == 1000)
    {
        SendEmails(emailList);
        emailList = new List<String>();
    }
}
//send the rest, if any
if(emailList.Any()) SendEmails(emailList);

无论如何,这在 imo 中要干净得多,因为您的电子邮件发送方法在逻辑上与您获取电子邮件地址的方式是分开的。

于 2013-10-14T14:33:27.367 回答
-1

如果你想用 linq 来做,我相信这个答案会完全符合你的要求,在下面你发送 group = 1000

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int group)
{
    return  source
        .Select((x, i) => new { Index = i, Value = x })
        .GroupBy(x => x.Index / group)
        .Select(x => x.Select(v => v.Value).ToList())
        .ToList();
}

这应该是评论而不是答案。请让我知道,如果是这种情况,我将删除并更改

于 2013-10-14T14:39:02.690 回答