2014-10-28 64 views
0

很多時候,我的清單過於龐大,我不得不把它們分成批處理。如何分批處理IEnumerable?

有沒有一種方法可以在方法或擴展中封裝它。我似乎必須在任何地方編寫這個批處理邏輯。

const int TAKE = 100; 
int skip = 0; 
while (skip < contacts.Count) 
{ 
    var batch = contacts.Skip(skip).Take(TAKE).ToList(); 
    DoSomething(batch); 
    skip += TAKE; 
} 

我願做這樣的事情 -

Batch(contacts, DoSomething); 

或任何類似,所以我不必一次又一次地寫這個批處理邏輯。

回答

1

使用批處理解決方案從this thread似乎微不足道:

const int batchSize = 100; 

foreach (var batch in contacts.Batch(batchSize)) 
{ 
    DoSomething(batch); 
} 

如果你也想包起來:

public static void ProcessInBatches<TSource>(
       this IEnumerable<TSource> source, 
       int batchSize, 
       Action<IEnumerable<TSource>> action) 
{ 
    foreach (var batch in source.Batch(batchSize)) 
    { 
     action(batch); 
    } 
} 

所以,你的代碼可被轉換成:

const int batchSize = 100; 

contacts.ProcessInBatches(batchSize, DoSomething);