Быстрая фильтрация списка по словарю - PullRequest
0 голосов
/ 09 октября 2018

Я застрял с выполнением операции фильтрации списка на основе словаря и мне нужна помощь в определении наиболее быстрого способа сделать это.

У меня есть список (также пробовал Hashset и Dictionary) изСтроки, которые мне нужно отфильтровать на основе значений другой структуры данных словаря в этом случае.Мне нужны все значения, которых нет в словаре.Количество списков составляет около 300000, а словарь - 200000. Когда я использую следующий код, это чертовски много времени.Пожалуйста, укажите, как я могу улучшить эту операцию.

Dictionary<string, string> dictLocalFile - this has around 200000 entries.

var finalFilesHashSet = 
    new HashSet<string>(
        FinalFilesList
       .Where(x => !dictLocalFile.Any(kvp => kvp.Key.Equals(Path.GetFileName(x)))));

1 Ответ

0 голосов
/ 09 октября 2018

Вы не используете словарь эффективно.Вы хотите проверить, не содержит ли словарь ключ.Измените свой код, чтобы использовать метод .ContainsKey.Кроме того, вам, вероятно, следует заранее вызвать Path.GetFileName (x) из этого цикла и измерить, каково его влияние.

var finalFilesHashSet = new HashSet<string>(
    FinalFilesList.Where(x => !dictLocalFile.ContainsKey(Path.GetFileName(x))));

С помощью написанного вами словарного кода в основном устраняются все преимущества производительности, которые словарь дает вам: O (1)) получить операции.Вместо этого вы конвертируете его в перечисляемый и перебираете содержимое словаря.Встроенный метод - это, по сути, поиск по хеш-таблице

...