I am curious to know if these two are functionally equivalent in all cases.
Is it possible that by changing the dictionary's default comparator that these two would be functionally different?
Also, isn't Keys.Contains
almost guaranteed to be slower?
These two functions do exactly the same thing.
Keys.Contains
exists becauseKeys
is anICollection<TKey>
, which defines aContains
method.The standard
Dictionary<TKey, TValue>.KeyCollection
implementation (the class, not the interface) defines it asSince it's implemented explicitly, you can't even call it directly.
You're either seeing the interface, which is what I explained above, or the LINQ
Contains()
extension method, which will also call the native implementation since it implementsICollection<T>
.Although they are pretty much equivalent for
Dictionary<,>
, I find it's much safer to stick withContainsKey()
.The reason is that in the future you may decide to use
ConcurrentDictionary<,>
(to make your code thread-safe), and in that implementation,ContainsKey
is significantly faster (since accessing theKeys
property does a whole bunch of locking and creates a new collection).