Словарь Keys.Contains против ContainsKey: они функционально эквивалентны?
Мне любопытно узнать, являются ли эти два функционально эквивалентными во всех случаях.
Возможно ли, что, изменив компаратор сравнения словаря, эти два будут функционально разными?
Кроме того, не гарантируется ли Keys.Contains
медленнее?
Ответы
Ответ 1
Эти две функции выполняют точно то же самое.
Keys.Contains
существует, потому что Keys
является ICollection<TKey>
, который определяет метод Contains
.
Стандартная реализация Dictionary<TKey, TValue>.KeyCollection
(класс, а не интерфейс) определяет ее как
bool ICollection<TKey>.Contains(TKey item){
return dictionary.ContainsKey(item);
}
Поскольку он реализован явно, вы даже не можете его напрямую называть.
Вы либо видите интерфейс, который я объяснял выше, либо метод расширения LINQ Contains()
, который также будет вызывать встроенную реализацию, поскольку он реализует ICollection<T>
.
Ответ 2
Хотя они в значительной степени эквивалентны для Dictionary<,>
, я считаю более безопасным придерживаться ContainsKey()
.
Причина в том, что в будущем вы можете использовать ConcurrentDictionary<,>
(чтобы сделать ваш код потокобезопасным), а в этой реализации ContainsKey
значительно быстрее (поскольку доступ к свойству Keys
делает целое пучок блокировки и создает новую коллекцию).