同じ型の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
[クシシュトフクワリーナ]
IEnumerableonの実装に関する問題について説明しましたDictionary<K,V>。どのタイプをIEnumerable.GetEnumerator().Current返す必要 がありますか?KeyValuePair<K,V>またはDictionaryEntry?も同じですICollection.CopyTo。どのタイプのインスタンスを配列にコピーする必要がありますか?私たちは次のことを決定しました:
IEnumerableそしてICollectionインターフェース実装はKeyValuePair<K,V>アイテムタイプとして使用 します。IDictionary特定のメンバー(GetEnumeratorreturnIDictionaryEnumerator)がDictionaryEntryアイテムタイプとして使用さ れます。その理由は、私たちが
IEnumerator<T>拡大する変更を行っている 最中であるからIEnumeratorです。Dictionary<K,V>->IEnumerable<T>-> から階層をたどると、奇妙なIEnumerableことに、列挙子から返されるアイテムのタイプが突然変更されました。