У меня есть куча текстовых файлов в папке, и все они должны иметь одинаковые заголовки.Другими словами, первые 100 строк всех файлов должны быть идентичны.Поэтому я написал функцию для проверки этого условия:
private static bool CheckHeaders(string folderPath, int headersCount)
{
var enumerators = Directory.EnumerateFiles(folderPath)
.Select(f => File.ReadLines(f).GetEnumerator())
.ToArray();
//using (enumerators)
//{
for (int i = 0; i < headersCount; i++)
{
foreach (var e in enumerators)
{
if (!e.MoveNext()) return false;
}
var values = enumerators.Select(e => e.Current);
if (values.Distinct().Count() > 1) return false;
}
return true;
//}
}
Причина, по которой я использую перечислители, заключается в эффективности памяти.Вместо загрузки всего содержимого файлов в память я построчно перечисляю файлы, пока не будет обнаружено несоответствие или не будут проверены все заголовки.
Моя проблема очевидна из закомментированных строк кода.Я хотел бы использовать блок using
для безопасного удаления всех перечислителей, но, к сожалению, using (enumerators)
не компилируется.Очевидно, using
может обрабатывать только один одноразовый предмет.Я знаю, что могу расположить перечислители вручную, обернув все это в блок try-finally
и, наконец, запустив логику удаления в цикле внутри, но это кажется неудобным.Можно ли использовать какой-либо механизм, чтобы сделать оператор using
жизнеспособным вариантом в этом случае?
Обновление
Я только что понял, что моя функция имеетсерьезный недостаток.Конструкция счетчиков не является надежной.Заблокированный файл может вызвать исключение, хотя некоторые перечислители уже созданы.Эти счетчики не будут выбрасываться.Это то, что я хочу исправить.Я думаю о чем-то вроде этого:
var enumerators = Directory.EnumerateFiles(folderPath)
.ToDisposables(f => File.ReadLines(f).GetEnumerator());
Метод расширения ToDisposables
должен гарантировать, что в случае исключения одноразовые изделия не останутся нераспределенными.