2017-09-03 24 views
4

の間に違いはあります:は考えDictionary.Keys.Contains(キー)とDictionary.ContainsKey(キー)

Dictionary<Guid, MyClass> dict; 

はどんな違いbetween

dict.Keys.Contains(key) 

and

dict.ContainsKey(key) 
があります

私は違いはないと思ったが、私は今確信していない。

+0

私は、「Contains」がKeyCollectionで異なって実装されていることに気づきませんでした。最初のアプローチでKeyCollectionの追加リファレンスを作成する方法では、気にする必要はありませんが、実際に必要なときにIMOは 'Keys'プロパティのみを使用します。 –

+0

いずれの方法も控えめに使用してください。あなたがそれを使用する必要があると思う時間のかなりの部分(キーが存在するかどうかを知りたいとき、**そのキーの値が**であるとき)は、代わりに 'TryGetValue'を使うべきでしょう。 – mjwills

+0

[Dictionary Keys.ContainsとContainsKeyの複製:機能的に同等かどうか](https://stackoverflow.com/questions/8235840/dictionary-keys-contains-vs-containskey-are-they-functionally-equivalent) – mjwills

答えて

8

この2つの方法は、同じtrue/falseの値を返すことが保証されています。 reference implementationによれば

dict.ContainsKey(key)dict.Keys.Contains(key)委譲:

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

この方法はKeyCollectionクラスの一部です。そのdictionaryフィールドは、プロパティによって返されたKeyCollectionを所有するDictionaryオブジェクトを参照します。

2

最初の行はキーを検索する前にキーコレクションを取得し、2行目は余分なステップを直接避けて辞書のキーを検索します。

Dictionary.Keysプロパティのドキュメントによれば、コレクションへのアクセスは一定の時間の操作であり、辞書キーのセット全体のコピーの作成は含まれません。したがって、キーを検索する前にキーコレクションを取得するという追加のステップを除いて、2つの操作の間にはほとんど違いがないようです。

すべてのことは同じですが、私は個人的には余分なステップをスキップし、より簡潔にあなたの意図を伝えるので、2番目のバージョンを好みます。

1

ディクショナリはルックアップキー用に最適化されています。

dict.ContainsKey(key)を使用すると、その最適化された検索を必ず使用します。

dict.Keys.Contains(key)を使用すると、実装の依存度は高くなります。素朴なルートは、最初にIEnumerable<TKey>を取得してから、(線形)検索を行います。実際のライブラリクラスはよりスマートになるかもしれませんが、必ずソースを参照して確認する必要があります。

+2

明示的に[ドキュメント]に記載されています(https://msdn.microsoft.com/en-us/library/mt481488(v=vs.110).aspx)* "このメソッドはO(1)操作です。" *純粋な実装を恐れる必要はないので、文書化されています。 –

+0

はい、それは単なる実装です。私はSortedDictionaryと同じステートメントを見つけることができませんでした。 –

関連する問題