Попробуйте это.
Перед выполнением любых сравнений предварительно обработайте 100 000 строк.Каждое слово в 100 000 строк будет ключом в объекте Dictionary<>
, значение будет представлять собой список идентификаторов (идентификаторы каждой строки, в которой встречается слово), например,
Dictionary<string, List<int>> allWords
При «поиске совпадения» вы сохраняете второй словарь, в этом ключе указан идентификатор строки, а его значением является целое число, которое вы будете увеличивать.например,
Dictionary<int, int> matches
Вы разбиваете строку поиска на слова, и для каждого идентификатора строки для каждого слова вы увеличиваете значение для идентификатора этой строки.
var searchWords = search.Split(" ");
foreach(var word in searchWord)
{
foreach(var id in allWords[word])
matches[id] += 1;
}
var bestRowId = (from m in matches orderby m.Value select m.Key).Last();
Идентификатор строки с наибольшимзначение является лучшим соответствием.
Построение словаря займет некоторое время заранее (но я думаю, не намного больше, чем для одного сравнения), но после этого оно будет ослепительно быстрым.
NB: Ключ к скорости здесь в том, что Dictionary будет использовать HashCode ключа, который он хранит, и хеш-функция .net для строк отлично.
Обновление
Если предварительная обработка для этого заказа занимает слишком много времени, то вы можете выполнить более легкую предварительную обработку.
Когда вы читаете каждую из 100 000 строк, разбейте ее на слова,и отсортировать массив слов.Затем, когда вы сравниваете, разбиваете строку для сравнения и сортируете ее тоже.Ваша функция экономит время, потому что она не разбивает каждую строку несколько раз, и ваши вложенные циклы могут быть заменены циклом для min(words1.length, words2.length)
.