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>
.