c# performance dictionary equivalence

c# - Dictionary Keys.Contains vs. ContainsKey: ¿son funcionalmente equivalentes?



performance equivalence (2)

Aunque son bastante equivalentes para Dictionary<,> , me parece más seguro seguir con ContainsKey() .

La razón es que en el futuro puede decidir usar ConcurrentDictionary<,> (para hacer que su código sea seguro para subprocesos), y en esa implementación, ContainsKey es significativamente más rápida (ya que acceder a la propiedad Keys hace un montón de bloqueo y crea un nueva colección).

Tengo curiosidad por saber si estos dos son funcionalmente equivalentes en todos los casos.

¿Es posible que al cambiar el comparador predeterminado del diccionario estos dos sean funcionalmente diferentes?

Además, ¿no Keys.Contains casi garantizado que Keys.Contains sea ​​más lento?


Estas dos funciones hacen exactamente lo mismo.

Keys.Contains existe porque Keys es un ICollection<TKey> , que define un método Contains .
El Dictionary<TKey, TValue>.KeyCollection estándar Dictionary<TKey, TValue>.KeyCollection implementa (la clase, no la interfaz) lo define como

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

Ya que está implementado explícitamente, ni siquiera puedes llamarlo directamente.

O está viendo la interfaz, que es lo que expliqué anteriormente, o el método de extensión LINQ Contains() , que también llamará a la implementación nativa ya que implementa ICollection<T> .