РЕДАКТИРОВАТЬ: обратите внимание, что я предполагаю, что разумно прочитать по крайней мере один файл в память. Возможно, вы захотите поменять местами приведенные ниже запросы, чтобы избежать загрузки «большого» файла в память, но даже 86 000 строк с (скажем) 1 КБ на строку будут меньше 2 ГБ памяти - что относительно мало для того, чтобы сделать что-то существенное.
Вы читаете "внутренний" файл каждый раз. В этом нет необходимости. Загрузите оба файла в память и перейдите оттуда. Черт возьми, для точных совпадений вы можете легко выполнить все в LINQ:
var query = from line1 in File.ReadLines("newDataPath + "HolidayList1.txt")
join line2 in File.ReadLines(dbFilePath + "newdbcontents.txt")
on line1 equals line2
select line1;
var commonLines = query.ToList();
Но для не-соединений это все еще просто; просто сначала полностью прочитайте один файл (явно), а затем передайте другой:
// Eagerly read the "inner" file
var lines2 = File.ReadAllLines(dbFilePath + "newdbcontents.txt");
var query = from line1 in File.ReadLines("newDataPath + "HolidayList1.txt")
from line2 in lines2
where line2.Contains(line1)
select line1;
var commonLines = query.ToList();
Здесь нет ничего умного - это просто очень простой способ написания кода для чтения всех строк в одном файле, а затем итерации по строкам в другом файле и проверки каждой строки по всем строкам в первом файле. Но даже без чего-либо умного, я сильно подозреваю, что это будет достаточно хорошо для вас. Сконцентрируйтесь на простоте, устраните ненужные операции ввода-вывода и посмотрите, достаточно ли это хорошо, прежде чем пытаться делать что-то более изумительное.
Обратите внимание, что в исходном коде вы должны использовать операторы using
для переменных StreamReader
, чтобы обеспечить их правильное расположение. Использование приведенного выше кода упрощает даже то, что это не нужно ...