break up array into little arrays

前端 未结 6 747
南方客
南方客 2021-01-20 06:03

i am sending out email to a list of people. I have the list of recipients in array but the list can get up to 500 people. There is a limitation on the number of recipients

相关标签:
6条回答
  • 2021-01-20 06:04

    Maybe ArraySegment<T> works for you? You'd have to split it up manually though, but this is not hard in a loop.

    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 讨论(0)
  • 2021-01-20 06:05

    Shouldn't LINQ be the right stuff for this?

    0 讨论(0)
  • 2021-01-20 06:13

    If you can use LINQ when you may find this useful: Linq: How to group by maximum number of items

    0 讨论(0)
  • 2021-01-20 06:21

    I would simply iterate over the complete array, building up the recipients string, then sending out an email when the limit is reached, then resetting the string and continuing on with the iteration until the next limit event or until the end of the array is reached.

    0 讨论(0)
  • 2021-01-20 06:31

    You could use the Batch operation from MoreLINQ:

    Person[] array = ...;
    
    var arrays = list.Batch(50).Select(x = x.ToArray());
    
    foreach (Person[] shorterArray in arrays)
    {
        ...
    }
    

    (If you're happy with IEnumerable<Person> instead of arrays, you don't need the Select call of course.)

    0 讨论(0)
  • 2021-01-20 06:31

    A common method for "paging" results from a set is to combine the Skip and Take methods provided by LINQ. This solution is great because it can be further combined with other LINQ methods to implement filtering, ordering, etc. as needed.

    I'm not sure what the performance considerations are for your application, so keep in mind that this may not perform very well for sets where the number of pages is relatively large (i.e., batch size is significantly smaller than the total size of the set), but it's at least fairly straightforward for anyone familiar with this style of coding.

    Here's an example of what this implementation might look like:

    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 讨论(0)
提交回复
热议问题