我正在發送電子郵件給人員列表。我有列表中的收件人列表,但列表最多可以容納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