我正在向一组人发送电子邮件。我有收件人名单的数组,但该名单最多可达500人。我的邮件服务器有每次发送的收件人数量限制(50个收件人)。因此,如果列表> 50,则需要将其拆分为不同的邮件。
将一个数组分成50个的最佳方法是什么?
例如:如果数组长度为120,则应返回3个数组,一个包含50个元素,另一个包含50个元素,第三个包含20个元素。
IEnumerable<T>
的扩展方法。你只需要在你的代码中加入using MoreLINQ;
指令即可。 - Jon SkeetArraySegment<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 提供的 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...
}