だから私はDictionary<int, int>
今日仕事中。私はおそらくList<int>
代わりに。違いはありますか、また、ある構造が他の構造よりも優先されるユースケースがありますか?
インデックスが位置的な配置以外に特別な意味を持つ場合は、Dictionary<int, int>
を使用します。
すぐに頭に浮かぶ例は、データベースにid列とint列を格納することです。たとえば、[person-id]
列と[personal-pin]
列がある場合、それらをDictionary<int, int>
に含めることができます。このようにpinDict[person-id]
はPINを提供しますが、インデックスは意味があり、List<int>
内の位置だけではありません。
しかし、実際には、整数の2つの関連リストがある場合は常に、これは適切なデータ構造になる可能性があります。
List
を配列、Dictionary
を ハッシュテーブル と考えてください。意味のあるキーを値にマップ(または関連付け)する必要がある場合にのみDictionary
を使用しますが、List
は位置(またはインデックス)のみを値にマップ(または関連付け)します。
たとえば、人の年齢と身長の関連付けを保存するとします。 Dictionary<int, int>
は、個人の年齢(int
)を身長(int
)にマッピングします。
Dictionary<int, int> personHeightMap = new Dictionary<int, int>();
personHeightMap.Add(21, 185);
personHeightMap.Add(31, 174);
int height = personHeightMap.ContainsKey(21) ? personHeightMap[21] : -1;
あまり便利な例ではありませんが、List
ではこれらの値を適切な位置に格納する必要があるため、これをエレガントに行うことはできません。
意味的には、Dictionary<int, T>
とList<T>
は非常によく似ており、どちらも.NETフレームワークのランダムアクセスコンテナーです。辞書の代わりとしてリストを使用するには、リストの空のスロットを表すために、タイプT
(null
など)に特別な値が必要です。 T
がint
のようなnull許容型ではない場合は、代わりにint?
を使用できます。または、正の値を格納するだけの場合は、次のような特別な値を使用できます-空のスロットを表す1。
どちらを選択するかは、キー値の範囲によって異なります。 Dictionary<int, T>
のキーが整数間隔内にあり、それらの間に多くのギャップがない場合(たとえば、[0、... 100]から80個の値)、List<T>
がより適切です。インデックスによるアクセスが高速であり、この場合の辞書に比べてメモリと時間のオーバーヘッドが少ないためです。
キー値が[0、...、1000000]のような範囲の100 int
値である場合、List<T>
は、Tの1000000値を保持するためにメモリを必要とします。 Tの値が100程度、intの値が100程度の大きさ(さらに、オーバーヘッドもあり、実際には、これらの100のキーと値を格納するためのメモリの約2倍を期待しています)。したがって、後者の場合、辞書がより適切になります。
どうすればそれらを同等と見なすことができますか?
ディクショナリはスパースであり、ランダム挿入を許可しますが、順トラバーサルを問題にします。リストはスパースではなく、順不同の挿入は高価であり、本質的に順トラバーサルを提供します。
一方が他方よりも劇的に優れていない状況はほとんどありません。
余談ですが、他のプログラミング言語では、このタイプのデータ構造を辞書ではなくマップと呼んでいます。
データをキーと値のペアとして有意義に定義できる場合、キーを使用して値を検索する必要がある場合、ディクショナリははるかに高速なアクセスを提供します。
たとえば、顧客のリストがあるとします。各顧客には、名前や住所、一意の顧客番号などの詳細が含まれています。処理中の注文のリストもあるとします。各注文には、行われている内容の詳細が含まれ、注文者の顧客番号を含める必要があります。
注文の発送準備が整ったら、発送先の住所を見つける必要があります。顧客がプレーンリストとして保存されている場合は、リスト全体を検索して、正しい顧客番号を持つ顧客を見つける必要があります。代わりに、顧客番号をキーとして、顧客を辞書に格納できます。辞書を使用すると、検索を行わなくても、正しい顧客を1つのステップで引き出すことができます。
辞書はハッシュを使用してデータを検索します。辞書は最初にキーのハッシュ値を計算し、このハッシュ値はターゲットデータバケットにつながります。その後、バケット内の各要素が等しいかどうかを確認する必要があります。ただし、最初のステップでは何も検索しないため、実際にはリストは最初の項目検索の辞書よりも高速になります。しかし、2番目のステップでは、リストは最初の項目を調べ、次に2番目の項目を調べる必要があります。そのため、各ステップで検索に時間がかかります。リストが大きいほど、時間がかかります。
...についての詳細 辞書対リスト 例を示します。