Я думаю, вам лучше откатить собственное решение для этого. Скажем, вы загрузили 5000 участников и хотите записать их в файл из 50 блоков (100 файлов), вы можете просто сделать:
StringBuilder sb = new StringBuilder(10000);
int x= 0;
foreach(var m in members){
if(++x%50 == 0){
File.WriteAllText(sb.ToString(), $@"c:\temp\{x%50}.csv");
sb.Length = 0;
}
sb.AppendLine(m.ToCsvRepresentationEtc());
}
Я хочу сказать не о записи в файл, это о знании того, что вы хотите сделать (например, записать в файл) со своими чанками, и о том, как сделать один проход из перечислимого, а также о том, как сделать разрезание на чанки за этот проход, изменив то, что вы делаете время от времени. В этом примере изменение действия является простым модулем, который очищает буфер StringBuilder и записывает в имя файла, основанное на модуле. Это предпочтительнее, чем сжигание большого количества памяти (выполнение этой процедуры разделения может быть ужасающим c в зависимости от используемых чисел; она не пытается подготовить какой-либо список подходящего размера на основе чисел) при предварительном разбиении его на части
По крайней мере, подумайте о переписывании чанкинга так, чтобы он использовал прямые 2d (неровные) массивы или списки с предустановленной емкостью; Вы знаете, какими они должны быть размерами, исходя из размера передаваемого в List и размера чанка:
public static class ListExtensions{
public List<List<T>> SplitPartition<T>(this IEnumerable<T> collection, int size)
{
var chunks = new List<List<T>>(collection.Count/size + 1);
var temp = new List<T>(size);
foreach (var element in collection)
{
if (temp.Count == size)
{
chunks.Add(temp);
temp = new List<T>(size);
}
temp.Add(element);
}
chunks.Add(temp);
return chunks;
}
}