Словарь Keys.Contains против ContainsKey: они функционально эквивалентны? - PullRequest
20 голосов
/ 23 ноября 2011

Мне любопытно узнать, являются ли эти два функционально эквивалентными во всех случаях.

Возможно ли, что при изменении компаратора по умолчанию в словаре эти два будут функционально разными?

Кроме того, разве Keys.Contains почти гарантированно не будет медленнее?

Ответы [ 2 ]

21 голосов
/ 23 ноября 2011

Эти две функции делают одно и то же.

Keys.Contains существует, потому что Keys - это ICollection<TKey>, который определяет метод Contains.
Стандартная реализация Dictionary<TKey, TValue>.KeyCollection (класс, а не интерфейс) определяет его как

bool ICollection<TKey>.Contains(TKey item){ 
    return dictionary.ContainsKey(item); 
}

Поскольку это реализовано явно, вы даже не можете вызвать его напрямую.


Вы видите либо интерфейс, который я объяснил выше, либо метод расширения LINQ Contains(), который также будет вызывать собственную реализацию, поскольку она реализует ICollection<T>.

9 голосов
/ 24 июня 2014

Хотя они в значительной степени эквивалентны Dictionary<,>, я считаю, что безопаснее придерживаться ContainsKey().

Причина в том, что в будущем вы можете решить использовать ConcurrentDictionary<,> (чтобы сделать ваш код потокобезопасным), и в этой реализации ContainsKey значительно быстрее (так как доступ к свойству Keys делает все связка блокировок и создает новую коллекцию).

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