Прежде всего, я думаю, что ваша логика просто неверна. Передача делегата в метод Contains методу Any приведет к частичным совпадениям строк, и вы явно заявили, что хотите только точные совпадения.
Если оставить в стороне, ваша проблема производительности связана с характером структуры данных списка; он не был разработан для эффективного поиска с помощью «Любой».
Проблема в том, что «Любой» просто выполняет линейный поиск, начиная с начала списка и просматривая его, пока не найдет совпадение. Если в списке есть записи по 100 тыс., То каждое «промах» будет сравнивать строки по 100 тыс., А каждое «попадание» будет делать в среднем сравнения строк по 50 тыс.
Это ужасно.
Что вам нужно сделать, это преобразовать Список в HashSet строк. Набор занимает немного больше памяти, но чрезвычайно быстро для поиска.
Другой возможной оптимизацией является сортировка одного из списков, который представляет собой операцию O (n lg n), а затем двоичный поиск в отсортированном списке, который является операцией O (lg n).
Третья возможная оптимизация заключается в сортировке обоих списков, а затем в написании сравнения отсортированных списков. Очевидно, что отсортированный список сравнения намного быстрее, чем несортированный список сравнения. Вы сохраняете индекс в каждом списке и продвигаете только индекс, который указывает на «меньший» элемент. То есть, если списки
A, B, C, D, G, I
B, D, E, H, I
Затем вы начинаете с индексов, указывающих на A и B. "A" меньше, поэтому вы переводите первый индекс в "B". Теперь они одинаковы; у тебя есть спичка Продвинуть их обоих. Первый индекс - «C», а второй - «D». "C" меньше ", так что продвигайте его ...
В более общем смысле, я думаю, вы описываете проблему на слишком низком уровне. Я чувствую, что вы задаете вопрос о дрелях, когда вы должны задавать вопрос о дырах. Возможно, дрель - это не самый подходящий инструмент. Можете ли вы сказать нам , почему вы соответствуете двум большим спискам строк? Возможно, есть более простой способ сделать то, что вы хотите.