//Первый проход, из основоного файла распределяем тольео те объекты, которые подходят по условию void FirstMerge(string FileName, float max) { //Массив потоков для записи StreamWriter[] writers = new StreamWriter[CountOfFiles]; for (int i = 0; i < writers.Length; ++i) { writers[i] = new StreamWriter((i + 1).ToString(), false); } //индекс потока записи в который записываем int pos = 0; //Буфер Sweets buf = new Sweets(); //Чтение файла using (StreamReader reader = new StreamReader(FileName)) { //Пока считывание корректно, проверяем условие и, если совпало, //записываем в вспомогательный файл и переходим к след. файловому потоку while (Sweets.TryRead(buf, reader)) { if (buf.Cost < max) { buf.WriteStream(writers[pos]); pos = (pos + 1) % CountOfFiles; } } } //Закрываем потоки для записи for (int i = 0; i < writers.Length; ++i) { writers[i].Close(); } }
//Попытка получить следующий объект из потока, //если считана вся серия или дошли до конца файла - возвращаем null, иначе - считываем, //увеличиваем кол-во считанных блоков и возвращаем объект public Sweets GetNext() { Sweets res = null; if (!IsEndOfFile && !IsMaxRecordsRead) { res = new Sweets(); if (Sweets.TryRead(res, reader)) { ReadBlocks++; } else { res = null; } } return(res); }