Kapan Anda akan menggunakan List <KeyValuePair <T1, T2 >> daripada Dictionary <T1, T2>?

96

Apa perbedaan antara List of KeyValuePair dan Dictionary untuk tipe yang sama? Apakah ada waktu yang tepat untuk menggunakan salah satunya?

Korpsekicker
sumber

Jawaban:

81

Ketika Anda tidak membutuhkan pencarian cepat pada kunci - mempertahankan hashtable yang digunakan oleh Dictionarymemiliki overhead tertentu.

Pavel Minaev
sumber
9
Juga operasi penyisipan daftar lebih cepat daripada yang ada di Kamus
Vadym Stetsiak
2
Kolomnya hanya dapat dibaca, tetapi Anda selalu dapat mengganti seluruh elemen dalam daftar.
Pavel Minaev
Lebih banyak perbedaan di sini
Vinni
63

Singkatnya, daftar tidak memaksakan keunikan kunci, jadi jika Anda membutuhkan semantik itu maka itulah yang harus Anda gunakan.

RCIX
sumber
7
+1 Perhatikan bahwa kamus juga tidak memaksakan keunikan nilai!
gdoron mendukung Monica
25

Kamus adalah jenis umum yang berisi kumpulan pasangan nilai kunci. Kamus cepat untuk operasi pencarian, karena menggunakan fungsi hash secara internal . Artinya, semua kunci di kamus harus unik .

Pertimbangkan contoh ini:

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.

Jadi, Anda harus selalu mempertimbangkan setidaknya dua hal:

  1. Apakah Anda ingin mencari item konkret di kamus?
  2. Apakah Anda ingin memiliki beberapa bidang non-unik (misalnya pasangan: nama depan / nama belakang).
Miroslav Holec
sumber
1
Saya pikir intinya di sini adalah bahwa kunci kamus harus unik di mana kunci Daftar <KeyValuePair> tidak boleh unik.
Bruno Bieri
6
@BrunoBieri List <KeyValuePair> kunci mungkin tidak unik
Nikhil Vartak
2
Saya memperbaiki komentar lama Anda yang berusia 2 tahun, dan Anda memperhatikannya. Tidak heran mengapa SO adalah satu-satunya platform Tanya Jawab tepercaya dan terpopuler.
Nikhil Vartak
14

Daftar ini juga akan berguna jika Anda peduli dengan urutan item.

tak seorangpun
sumber
2
Bukankah SortedDictionary akan membahas ini?
Alex Angas
2
Ya, tetapi SortedDictionary tidak dapat mencakup urutan nilai, hanya kuncinya.
ConfusedMan
7

Lebih jauh dari jawaban Phillip Ngan, SOAP atau lainnya, Anda tidak dapat membuat serialisasi XML objek yang mengimplementasikan IDictionary.

T: Mengapa saya tidak dapat membuat serial hashtables?

J: XmlSerializer tidak dapat memproses kelas yang mengimplementasikan antarmuka IDictionary. Ini sebagian karena kendala jadwal dan sebagian karena fakta bahwa hashtable tidak memiliki mitra dalam sistem tipe XSD. Satu-satunya solusi adalah dengan menerapkan hashtable khusus yang tidak mengimplementasikan antarmuka IDictionary.

dari sini

tjmoore
sumber
5

Dalam layanan web SOAP untuk silverlight, kami telah menemukan bahwa Kamus tidak membuat serial. Ini akan menjadi situasi di mana Anda akan menggunakan List of KeyValuePair melalui Dictionary.

.

Phillip Ngan
sumber
3

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

KeyValuePairvs. DictionaryEntry
[Krzysztof Cwalina]

Kami membahas masalah dengan penerapan IEnumerablepada Dictionary<K,V>. Jenis apa yang harus IEnumerable.GetEnumerator().Current dikembalikan? KeyValuePair<K,V>atau DictionaryEntry? Sama untuk ICollection.CopyTo. Contoh jenis apa yang harus disalin ke array?

Kami memutuskan hal berikut: IEnumerable dan ICollectionimplementasi antarmuka akan digunakan KeyValuePair<K,V>sebagai tipe item. IDictionaryanggota tertentu ( GetEnumeratorkembali IDictionaryEnumerator) akan digunakan DictionaryEntrysebagai tipe barang.

Alasannya adalah bahwa kami sedang dalam proses membuat perubahan yang IEnumerator<T>akan meluas IEnumerator. Akan sangat aneh jika menjalankan hierarki dari Dictionary<K,V>-> IEnumerable<T>-> IEnumerable kami tiba-tiba mengubah jenis item yang dikembalikan dari enumerator.

Anax
sumber