2009-09-02 55 views
3

我正在发送电子邮件给人员列表。我有列表中的收件人列表,但列表最多可以容纳500人。我的邮件服务器一次发送的收件人数有限制(50个收件人)将数组分解成小数组

因此,如果列表大于50,我需要将其分解为不同的邮件。

什么是采取一个阵列,并把它分解成50

例如数组的最佳方式:

如果数组是120长,我希望3个阵列退换,50,另一与50和第三与20.

+0

[将列表拆分为与LINQ的子列表]可能的重复(http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal 2013-02-18 12:10:57

回答

8

您可以使用Batch操作从MoreLINQ

Person[] array = ...; 

var arrays = list.Batch(50).Select(x = x.ToArray()); 

foreach (Person[] shorterArray in arrays) 
{ 
    ... 
} 

(如果你满意的IEnumerable<Person>代替数组,你不需要Select呼叫当然)。

+0

我只是有一个字符串数组,并且似乎无法在morelinq中找到批处理方法 – leora 2009-09-02 14:17:32

+0

第一个链接显示了批处理方法。这是'IEnumerable '的扩展方法。你只需要在代码中使用'MoreLINQ;'指令。 – 2009-09-02 14:30:35

3

我只是遍历整个数组,建立收件人的字符串,然后发出一个电子邮件时,达到限制,然后重置字符串,并继续迭代,直到下一个限制事件或直到数组到达结束。

+0

好而简单。我喜欢。 – 2009-09-02 14:03:39

+0

这是我会做的。 +1 – 2009-09-02 16:26:13

3

也许ArraySegment<T>适合你吗?你不得不手动分割它,但是这在循环中并不难。

int recipient = 0; 
while (recipient < recipients.Count) { 
    ArraySegment<string> recipientSegment = new ArraySegment<string>(recipients, recipient, Math.Min(50, recipients.Count-recipient)); 
    // build your message here, using the recipientSegment for the names 
    recipient += 50; 
} 
0

“pa ging“的结果集合了LINQ提供的Skip和Take方法。这个解决方案非常棒,因为它可以与其他LINQ方法进一步结合,根据需要实现过滤,排序等。

我不确定应用程序的性能考虑因素是什么,因此请记住,对于页面数量相对较大的集合,这可能表现不佳(即批量大小远远小于总数但对于熟悉这种编码风格的人来说,它至少相当简单。

这里是什么这个实现可能看起来像一个例子:

List<EmailAddress> list = new List<EmailAddress>(); 
const int BATCH_SIZE = 50; 

for (int i = 0; i < list.Count; i += BATCH_SIZE) 
{ 
    IEnumerable<EmailAddress> currentBatch = 
     list.Skip(i).Take(BATCH_SIZE); 

    // do stuff... 
}
+0

当我看看currentbatch它的空白你有//做东西 – leora 2009-09-02 14:35:09

+0

@oo:抱歉,我没有在发布之前运行我的代码。该错误已得到修复。 – jeremyalan 2009-09-02 16:24:58

0

不宜LINQ是这个正确的东西?