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?

Jawaban:


81

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


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.


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).

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


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


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.

.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.