の間に違いはあります:は考えDictionary.Keys.Contains(キー)とDictionary.ContainsKey(キー)
Dictionary<Guid, MyClass> dict;
はどんな違いbetween
dict.Keys.Contains(key)
dict.ContainsKey(key)
があります
私は違いはないと思ったが、私は今確信していない。
の間に違いはあります:は考えDictionary.Keys.Contains(キー)とDictionary.ContainsKey(キー)
Dictionary<Guid, MyClass> dict;
はどんな違いbetween
dict.Keys.Contains(key)
dict.ContainsKey(key)
があります
私は違いはないと思ったが、私は今確信していない。
この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行目は余分なステップを直接避けて辞書のキーを検索します。
Dictionary.Keysプロパティのドキュメントによれば、コレクションへのアクセスは一定の時間の操作であり、辞書キーのセット全体のコピーの作成は含まれません。したがって、キーを検索する前にキーコレクションを取得するという追加のステップを除いて、2つの操作の間にはほとんど違いがないようです。
すべてのことは同じですが、私は個人的には余分なステップをスキップし、より簡潔にあなたの意図を伝えるので、2番目のバージョンを好みます。
ディクショナリはルックアップキー用に最適化されています。
dict.ContainsKey(key)
を使用すると、その最適化された検索を必ず使用します。
dict.Keys.Contains(key)
を使用すると、実装の依存度は高くなります。素朴なルートは、最初にIEnumerable<TKey>
を取得してから、(線形)検索を行います。実際のライブラリクラスはよりスマートになるかもしれませんが、必ずソースを参照して確認する必要があります。
明示的に[ドキュメント]に記載されています(https://msdn.microsoft.com/en-us/library/mt481488(v=vs.110).aspx)* "このメソッドはO(1)操作です。" *純粋な実装を恐れる必要はないので、文書化されています。 –
はい、それは単なる実装です。私はSortedDictionaryと同じステートメントを見つけることができませんでした。 –
私は、「Contains」がKeyCollectionで異なって実装されていることに気づきませんでした。最初のアプローチでKeyCollectionの追加リファレンスを作成する方法では、気にする必要はありませんが、実際に必要なときにIMOは 'Keys'プロパティのみを使用します。 –
いずれの方法も控えめに使用してください。あなたがそれを使用する必要があると思う時間のかなりの部分(キーが存在するかどうかを知りたいとき、**そのキーの値が**であるとき)は、代わりに 'TryGetValue'を使うべきでしょう。 – mjwills
[Dictionary Keys.ContainsとContainsKeyの複製:機能的に同等かどうか](https://stackoverflow.com/questions/8235840/dictionary-keys-contains-vs-containskey-are-they-functionally-equivalent) – mjwills