2009-09-02 77 views
3

我正在發送電子郵件給人員列表。我有列表中的收件人列表,但列表最多可以容納500人。我的郵件服務器一次發送的收件人數有限制(50個收件人)將數組分解成小數組

因此,如果列表大於50,我需要將其分解爲不同的郵件。

什麼是採取一個陣列,並把它分解成50

例如數組的最佳方式:

如果數組是120長,我希望3個陣列退換,50,另一與50和第三與20.

+0

[將列表拆分爲與LINQ的子列表]可能的重複(http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq) – nawfal 2013-02-18 12:10:57

回答

8

您可以使用Batch操作從MoreLINQ

Person[] array = ...; 

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

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

(如果你滿意的IEnumerable<Person>代替數組,你不需要Select呼叫當然)。

+0

我只是有一個字符串數組,並且似乎無法在morelinq中找到批處理方法 – leora 2009-09-02 14:17:32

+0

第一個鏈接顯示了批處理方法。這是'IEnumerable '的擴展方法。你只需要在代碼中使用'MoreLINQ;'指令。 – 2009-09-02 14:30:35

3

我只是遍歷整個數組,建立收件人的字符串,然後發出一個電子郵件時,達到限制,然後重置字符串,並繼續迭代,直到下一個限制事件或直到數組到達結束。

+0

好而簡單。我喜歡。 – 2009-09-02 14:03:39

+0

這是我會做的。 +1 – 2009-09-02 16:26:13

3

也許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; 
} 
0

「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... 
}
+0

當我看看currentbatch它的空白你有//做東西 – leora 2009-09-02 14:35:09

+0

@oo:抱歉,我沒有在發佈之前運行我的代碼。該錯誤已得到修復。 – jeremyalan 2009-09-02 16:24:58

0

不宜LINQ是這個正確的東西?