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.