同じ型のKeyValuePairのリストとディクショナリの違いは何ですか?どちらか一方を使用する適切な時間はありますか?
同じ型のKeyValuePairのリストとディクショナリの違いは何ですか?どちらか一方を使用する適切な時間はありますか?
回答:
キーの高速検索が必要ない場合-によって使用されるハッシュテーブルを維持するとDictionary
、一定のオーバーヘッドが発生します。
辞書は、キーと値のペアのコレクションを含むジェネリック型です。内部でハッシュ関数を使用しているため、辞書はルックアップ操作に高速です。つまり、すべてのキーは辞書で一意である必要があります。
次の例を検討してください。
List<KeyValuePair<int, string>> pairs = new List<KeyValuePair<int, string>>();
pairs.Add(new KeyValuePair<int, string>(1, "Miroslav"));
pairs.Add(new KeyValuePair<int, string>(2, "Naomi"));
pairs.Add(new KeyValuePair<int, string>(2, "Ingrid"));
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "Miroslav");
dict.Add(2, "Naomi");
dict.Add(2, "Ingrid"); // System.ArgumentException: An item with the same key has already been added.
したがって、常に少なくとも2つのことを考慮する必要があります。
リストは、アイテムの順序を気にするときにも役立ちます。
http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspxから:
KeyValuePair
対DictionaryEntry
[クシシュトフクワリーナ]
IEnumerable
onの実装に関する問題について説明しましたDictionary<K,V>
。どのタイプをIEnumerable.GetEnumerator().Current
返す必要 がありますか?KeyValuePair<K,V>
またはDictionaryEntry
?も同じですICollection.CopyTo
。どのタイプのインスタンスを配列にコピーする必要がありますか?私たちは次のことを決定しました:
IEnumerable
そしてICollection
インターフェース実装はKeyValuePair<K,V>
アイテムタイプとして使用 します。IDictionary
特定のメンバー(GetEnumerator
returnIDictionaryEnumerator
)がDictionaryEntry
アイテムタイプとして使用さ れます。その理由は、私たちが
IEnumerator<T>
拡大する変更を行っている 最中であるからIEnumerator
です。Dictionary<K,V>
->IEnumerable<T>
-> から階層をたどると、奇妙なIEnumerable
ことに、列挙子から返されるアイテムのタイプが突然変更されました。