どのような場合に、Dictionary <T1、T2>の代わりにList <KeyValuePair <T1、T2 >>を使用しますか?


95

同じ型のKeyValuePairのリストとディクショナリの違いは何ですか?どちらか一方を使用する適切な時間はありますか?

回答:


80

キーの高速検索が必要ない場合-によって使用されるハッシュテーブルを維持するとDictionary、一定のオーバーヘッドが発生します。


9
また、リストの挿入操作が高速であるという辞書の1
Vadym Stetsiak

2
そのフィールドは読み取り専用ですが、リスト内の要素全体をいつでも置き換えることができます。
Pavel Minaev 2016


62

要するに、リストはキーの一意性を強制しないので、そのセマンティックが必要な場合はそれを使用する必要があります。


7
+1辞書は値の一意性も強制しないことに注意してください!
gdoronは

25

辞書は、キーと値のペアのコレクションを含むジェネリック型です。内部でハッシュ関数を使用しているため、辞書はルックアップ操作に高速です。つまり、すべてのキーは辞書で一意である必要があります

次の例を検討してください。

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つのことを考慮する必要があります。

  1. 辞書で具体的なアイテムを検索しますか?
  2. 一部のフィールドを非固有にしますか(たとえば、ペア:firstname / lastname)。

1
ここでのポイントは、List <KeyValuePair>キーが一意であってはならず、ディクショナリキーは一意でなければならないということです。
Bruno Bieri

5
@BrunoBieri List <KeyValuePair>キー一意でない可能性があります
Nikhil Vartak

2
私はあなたの2歳のコメントを修正しました、そしてあなたはそれに気づきました。SOが唯一信頼され、最も人気のあるQ&Aプラットフォームであるのは当然です。
Nikhil Vartak 2017

14

リストは、アイテムの順序を気にするときにも役立ちます。


2
SortedDictionaryはこれをカバーしませんか?
Alex Angas

2
はい。ただし、SortedDictionaryは値の順序をカバーできず、キーのみをカバーできます。
ConfusedMan

7

Phillip Nganの回答(SOAPまたはその他)に加えて、IDictionaryを実装するオブジェクトをXMLシリアル化することはできません。

Q:ハッシュテーブルをシリアル化できないのはなぜですか?

A:XmlSerializerは、IDictionaryインターフェイスを実装するクラスを処理できません。これは、一部はスケジュールの制約によるものであり、一部はハッシュテーブルがXSD型システムに対応するものを持たないという事実によるものでした。唯一の解決策は、IDictionaryインターフェイスを実装しないカスタムハッシュテーブルを実装することです。

ここから


5

SilverlightのSOAP Webサービスでは、Dictionaryはシリアル化されないことがわかりました。これは、ディクショナリに対してKeyValuePairのリストを使用する状況です。


3

http://blogs.msdn.com/bclteam/archive/2004/09/03/225473.aspxから:

KeyValuePairDictionaryEntry
[クシシュトフクワリーナ]

IEnumerableonの実装に関する問題について説明しました Dictionary<K,V>。どのタイプをIEnumerable.GetEnumerator().Current 返す必要 がありますか?KeyValuePair<K,V>または DictionaryEntry?も同じです ICollection.CopyTo。どのタイプのインスタンスを配列にコピーする必要がありますか?

私たちは次のことを決定しました:IEnumerable そしてICollectionインターフェース実装はKeyValuePair<K,V>アイテムタイプとして使用 します。 IDictionary特定のメンバー(GetEnumeratorreturn IDictionaryEnumerator)がDictionaryEntryアイテムタイプとして使用さ れます。

その理由は、私たちがIEnumerator<T>拡大する変更を行っている 最中であるから IEnumeratorです。Dictionary<K,V>-> IEnumerable<T>-> から階層をたどると、奇妙な IEnumerable ことに、列挙子から返されるアイテムのタイプが突然変更されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.