Dictionary Keys.Contains vs. ContainsKey: are they functionally equivalent?

前端 未结 2 1363
心在旅途
心在旅途 2020-12-06 16:20

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

相关标签:
2条回答
  • 2020-12-06 16:34

    Although they are pretty much equivalent for Dictionary<,>, I find it's much safer to stick with ContainsKey().

    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 the Keys property does a whole bunch of locking and creates a new collection).

    0 讨论(0)
  • 2020-12-06 16:55

    These two functions do exactly the same thing.

    Keys.Contains exists because Keys is an ICollection<TKey>, which defines a Contains method.
    The standard Dictionary<TKey, TValue>.KeyCollection implementation (the class, not the interface) defines it as

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

    Since 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 implements ICollection<T>.

    0 讨论(0)
提交回复
热议问题