将数组拆分为小数组

3
我正在向一组人发送电子邮件。我有收件人名单的数组,但该名单最多可达500人。我的邮件服务器有每次发送的收件人数量限制(50个收件人)。因此,如果列表> 50,则需要将其拆分为不同的邮件。 将一个数组分成50个的最佳方法是什么? 例如:如果数组长度为120,则应返回3个数组,一个包含50个元素,另一个包含50个元素,第三个包含20个元素。

6个回答

8
您可以使用MoreLINQ中的Batch操作:
Person[] array = ...;

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

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

如果您喜欢使用 IEnumerable<Person> 而不是数组,则当然不需要 Select 调用。


我只有一个字符串数组,似乎找不到MoreLINQ中的Batch方法。 - leora
第一个链接展示了批处理方法。它是IEnumerable<T>的扩展方法。你只需要在你的代码中加入using MoreLINQ;指令即可。 - Jon Skeet

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;
}

3
我会简单地遍历整个数组,构建收件人字符串,当达到限制时发送电子邮件,然后重置字符串并继续迭代,直到下一个限制事件或到达数组的末尾。

1

0

LINQ 不应该是处理这个的正确工具吗?


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...
}

当我查看 currentbatch 时,它是空的,而你在 // do stuff 的位置。 - leora
@oo:非常抱歉,我在发布之前没有运行我的代码。该错误已经修复。 - jeremyalan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接