Saya mencoba untuk membungkus kepala saya di sekitar struktur data mana yang paling efisien dan kapan / di mana menggunakan yang mana.
Sekarang, bisa jadi saya hanya tidak mengerti strukturnya dengan cukup baik, tetapi bagaimana ILookup(of key, ...)
perbedaannya Dictionary(of key, list(of ...))
?
Juga di mana saya ingin menggunakan ILookup
dan di mana akan lebih efisien dalam hal kecepatan program / memori / mengakses data, dll?
Jawaban:
Dua perbedaan signifikan:
Lookup
tidak kekal. Yay :) (Setidaknya, saya percayaLookup
kelas konkretnya tidak dapat diubah, danILookup
antarmuka tidak menyediakan anggota yang bermutasi. Mungkin saja ada implementasi yang dapat diubah lainnya.)KeyNotFoundException
. (Karenanya tidak adaTryGetValue
, AFAICR.)Mereka cenderung setara dalam efisiensi - pencarian mungkin menggunakan
Dictionary<TKey, GroupingImplementation<TValue>>
belakang layar, misalnya. Pilih di antara mereka berdasarkan kebutuhan Anda. Secara pribadi saya menemukan bahwa pencarian biasanya lebih cocok daripadaDictionary<TKey, List<TValue>>
, sebagian besar karena dua poin pertama di atas.Perhatikan bahwa sebagai detail implementasi, implementasi konkret
IGrouping<,>
yang digunakan untuk implementasi nilaiIList<TValue>
, yang berarti efisien untuk digunakan bersamaCount()
,ElementAt()
dll.sumber
Menarik bahwa tidak ada yang menyatakan perbedaan terbesar sebenarnya (Diambil langsung dari MSDN ):
sumber
Baik a
Dictionary<Key, List<Value>>
dan secaraLookup<Key, Value>
logis dapat menyimpan data yang diorganisasikan dengan cara yang serupa dan keduanya memiliki tingkat efisiensi yang sama. Perbedaan utama adalah aLookup
tidak dapat diubah: ia tidak memilikiAdd()
metode dan tidak ada konstruktor publik (dan seperti yang disebutkan Jon Anda dapat meminta kunci yang tidak ada tanpa pengecualian dan memiliki kunci sebagai bagian dari pengelompokan).Seperti yang Anda gunakan, itu benar-benar tergantung pada bagaimana Anda ingin menggunakannya. Jika Anda mempertahankan peta kunci untuk beberapa nilai yang terus-menerus dimodifikasi, maka a
Dictionary<Key, List<Value>>
mungkin lebih baik karena dapat diubah.Namun, jika Anda memiliki urutan data dan hanya ingin tampilan baca-saja dari data yang diatur oleh kunci, maka pencarian sangat mudah dibangun dan akan memberi Anda snapshot hanya-baca.
sumber
Perbedaan utama antara a
ILookup<K,V>
dan aDictionary<K, List<V>>
adalah kamus bisa berubah; Anda dapat menambah atau menghapus kunci, dan juga menambah atau menghapus item dari daftar yang dicari. SebuahILookup
tidak berubah dan tidak dapat dimodifikasi setelah dibuat.Implementasi yang mendasari kedua mekanisme akan sama atau serupa, sehingga kecepatan pencarian dan jejak memori mereka akan kurang lebih sama.
sumber
Perbedaan lain yang belum disebutkan adalah bahwa Lookup () mendukung kunci null :
sumber
Saat pengecualian bukan opsi, buka Pencarian
Jika Anda mencoba untuk mendapatkan struktur seefisien
Dictionary
tapi Anda tidak tahu pasti tidak ada kunci duplikat dalam input,Lookup
lebih aman.Seperti disebutkan dalam jawaban lain, itu juga mendukung kunci nol, dan mengembalikan selalu hasil yang valid ketika ditanyai dengan data yang sewenang-wenang, sehingga nampak lebih tangguh terhadap input yang tidak dikenal (kurang rentan daripada Kamus untuk meningkatkan pengecualian).
Dan itu benar terutama jika Anda membandingkannya dengan
System.Linq.Enumerable.ToDictionary
fungsi:Alternatifnya adalah menulis kode manajemen kunci duplikat Anda sendiri di dalam sebuah
foreach
loop.Pertimbangan kinerja, Kamus: pemenang yang jelas
Jika Anda tidak memerlukan daftar dan Anda akan mengelola sejumlah besar item,
Dictionary
(atau bahkan struktur khusus Anda sendiri) akan lebih efisien:Karena
Lookup
harus mempertahankan daftar item untuk setiap tombol, itu lebih lambat dari Kamus (sekitar 3x lebih lambat untuk sejumlah besar item)sumber