我发送电子邮件给人员列表。我有阵列中的收件人列表,但列表最多可以容纳500人。我的邮件服务器一次发送的收件人数量有限制(50个收件人)
所以如果列表是> 50我需要把它分解成不同的邮件。
获取一个数组并将其分解为50
的数组的最佳方法是什么例如:
如果数组是120长,我希望返回3个数组,一个50,另一个50,第三个20。
答案 0 :(得分:8)
Person[] array = ...;
var arrays = list.Batch(50).Select(x = x.ToArray());
foreach (Person[] shorterArray in arrays)
{
...
}
(如果您对IEnumerable<Person>
而不是数组感到满意,那么您当然不需要Select
来电。)
答案 1 :(得分:5)
也许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;
}
答案 2 :(得分:3)
我只是迭代整个数组,构建收件人字符串,然后在达到限制时发送电子邮件,然后重置字符串并继续迭代直到下一个限制事件或直到结束到达了数组。
答案 3 :(得分:1)
如果您可以使用LINQ,可能会发现它很有用:Linq: How to group by maximum number of items
答案 4 :(得分:0)
从集合中“分页”结果的常用方法是组合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...
}
答案 5 :(得分:0)
LINQ不应该是正确的吗?