Словарь 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 делает целое пучок блокировки и создает новую коллекцию).