Производительность LINQ против словаря - PullRequest
3 голосов
/ 19 октября 2011

Во многих ситуациях для простоты я бы предпочел использовать List или HashSet в сочетании с LINQ вместо использования словаря. Однако я обычно придерживался словаря, потому что думал, что словарь будет более производительным из-за его реализации хеш-таблицы.

Например:

Когда я делаю это в LINQ:

bool exists = hashset.Any(item => item.Key == someKey);

Потеряю ли я значительную производительность по сравнению со следующим эквивалентом со словарем?

bool exists = dictionary.ContainsKey(someKey); // an O(1) operation

Оптимизированы ли запросы LINQ таким образом, чтобы их можно было оправдать по сравнению со словарем? Или приведенная выше операция Any () является простой операцией O (n) независимо от типа выполняемой коллекции?

1 Ответ

9 голосов
/ 19 октября 2011

В вашем случае вы исключаете пользу хэш-набора, потому что Любой в этом случае - это метод расширения , определенный в IEnumerable.Он просто перебирает хэш-набор, как если бы он был списком, и вызывает оператор == для каждого элемента.Фактически, эти два примера кода даже не являются строго эквивалентными - оператор LINQ использует оператор ==, а словарь использует хэш-код / ​​равенство.Они эквивалентны для типов значений и строк, но не для всех классов.

То, что вы можете сделать, это:

bool exists = hashset.Contains(item.Key);

Это будет использовать оптимизированный поиск Hashset и не потребует от васоставьте фиктивное значение, как в словаре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...