我正在发送电子邮件给人员列表。我有列表中的收件人列表,但列表最多可以容纳500人。我的邮件服务器一次发送的收件人数有限制(50个收件人)将数组分解成小数组
因此,如果列表大于50,我需要将其分解为不同的邮件。
什么是采取一个阵列,并把它分解成50
例如数组的最佳方式:
如果数组是120长,我希望3个阵列退换,50,另一与50和第三与20.
我正在发送电子邮件给人员列表。我有列表中的收件人列表,但列表最多可以容纳500人。我的邮件服务器一次发送的收件人数有限制(50个收件人)将数组分解成小数组
因此,如果列表大于50,我需要将其分解为不同的邮件。
什么是采取一个阵列,并把它分解成50
例如数组的最佳方式:
如果数组是120长,我希望3个阵列退换,50,另一与50和第三与20.
Person[] array = ...;
var arrays = list.Batch(50).Select(x = x.ToArray());
foreach (Person[] shorterArray in arrays)
{
...
}
(如果你满意的IEnumerable<Person>
代替数组,你不需要Select
呼叫当然)。
我只是有一个字符串数组,并且似乎无法在morelinq中找到批处理方法 – leora 2009-09-02 14:17:32
第一个链接显示了批处理方法。这是'IEnumerable
我只是遍历整个数组,建立收件人的字符串,然后发出一个电子邮件时,达到限制,然后重置字符串,并继续迭代,直到下一个限制事件或直到数组到达结束。
好而简单。我喜欢。 – 2009-09-02 14:03:39
这是我会做的。 +1 – 2009-09-02 16:26:13
也许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;
}
如果你可以使用LINQ,你可能会觉得这很有用:Linq: How to group by maximum number of items
“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...
}
当我看看currentbatch它的空白你有//做东西 – leora 2009-09-02 14:35:09
@oo:抱歉,我没有在发布之前运行我的代码。该错误已得到修复。 – jeremyalan 2009-09-02 16:24:58
不宜LINQ是这个正确的东西?
[将列表拆分为与LINQ的子列表]可能的重复(http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal 2013-02-18 12:10:57