Я пытаюсь сделать то, что, по моему мнению, является «de-intersect» (я не уверен, что такое собственное имя, но это то, что назвал его Тим Суини из EpicGames в старом UnrealEd)Ускоренный способ сделать список <T> .Contains()
// foo and bar have some identical elements (given a case-insensitive match)
List‹string› foo = GetFoo();
List‹string› bar = GetBar();
// remove non matches
foo = foo.Where(x => bar.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
bar = bar.Where(x => foo.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
Тогда позже, я другое дело, где я вычитаем результат от оригинала, чтобы увидеть, какие элементы я удалил. Это супер-быстро, используя .Except(), поэтому никаких проблем нет.
Должен быть более быстрый способ сделать это, потому что этот довольно плохо работает с ~ 30 000 элементов (строки) в любом из списков. Предпочтительно, чтобы способ сделать этот шаг и один позже одним махом был бы приятным. Я попытался использовать .Exists() вместо .Contains(), но он немного медленнее. Я чувствую себя немного толстым, но я думаю, что это должно быть возможно с некоторой комбинацией .Except() и .Intersect() и/или .Union().
Почему вы делаете это дважды? Разве первое сравнение не даст вам всех матчей? Если я не пойму это неправильно. – gcores
Мне нужно сохранить случай, который может (и должен) отличаться между двумя списками. В принципе, это для автоматической программы сравнения каталогов, которая может синхронизировать путь и имя файла, и игнорировать несоответствующие записи с обеих сторон. –