Saya dapat melihat jawaban yang diajukan berfokus pada kinerja. Artikel yang diberikan di bawah ini tidak memberikan informasi baru tentang kinerja, tetapi menjelaskan mekanisme yang mendasarinya. Juga perhatikan itu tidak fokus pada tiga Collection
Jenis yang disebutkan dalam pertanyaan, tetapi membahas semua Jenis System.Collections.Generic
namespace.
http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Ekstrak:
Kamus <>
Dictionary mungkin adalah class container asosiatif yang paling banyak digunakan. Kamus adalah kelas tercepat untuk pencarian / penyisipan / penghapusan asosiatif karena menggunakan tabel hash di bawah sampulnya . Karena kunci di-hash, jenis kunci harus menerapkan GetHashCode () dan Equals () dengan benar atau Anda harus menyediakan IEqualityComparer eksternal ke kamus tentang konstruksi. Waktu penyisipan / penghapusan / pencarian item dalam kamus diamortisasi waktu konstan - O (1) - yang berarti tidak peduli seberapa besar kamus, waktu yang diperlukan untuk menemukan sesuatu tetap relatif konstan. Ini sangat diinginkan untuk pencarian kecepatan tinggi. Satu-satunya downside adalah bahwa kamus, secara alami menggunakan tabel hash, tidak berurutan, jadiAnda tidak dapat dengan mudah menelusuri item dalam Kamus secara berurutan .
SortedDictionary <>
SortedDictionary mirip dengan Dictionary dalam penggunaan tetapi sangat berbeda dalam implementasinya. The SortedDictionary menggunakan pohon biner di bawah selimut untuk menjaga barang-barang dalam rangka oleh kunci . Sebagai konsekuensi dari pengurutan, tipe yang digunakan untuk kunci harus mengimplementasikan IComparable dengan benar sehingga kunci dapat diurutkan dengan benar. Kamus yang diurutkan memperdagangkan sedikit waktu pencarian untuk kemampuan mempertahankan item secara berurutan, sehingga waktu penyisipan / penghapusan / pencarian dalam kamus yang diurutkan adalah logaritmik - O (log n). Secara umum, dengan waktu logaritmik, Anda dapat menggandakan ukuran koleksi dan hanya perlu melakukan satu perbandingan ekstra untuk menemukan itemnya. Gunakan SortedDictionary jika Anda ingin pencarian cepat, tetapi juga ingin dapat menjaga koleksi agar sesuai dengan kuncinya.
SortedList <>
SortedList adalah kelas wadah asosiatif yang diurutkan lainnya dalam wadah generik. Sekali lagi SortedList, seperti SortedDictionary, menggunakan kunci untuk mengurutkan pasangan kunci-nilai . Tidak seperti SortedDictionary, item dalam SortedList disimpan sebagai larik item yang diurutkan. Ini berarti bahwa penyisipan dan penghapusan bersifat linier - O (n) - karena menghapus atau menambah item mungkin melibatkan pengalihan semua item ke atas atau ke bawah dalam daftar. Namun, waktu pencarian adalah O (log n) karena SortedList dapat menggunakan pencarian biner untuk menemukan item apa pun dalam daftar dengan kuncinya. Jadi, mengapa Anda ingin melakukan ini? Nah, jawabannya adalah jika Anda akan memuat SortedList di muka, penyisipan akan lebih lambat, tetapi karena pengindeksan array lebih cepat daripada mengikuti tautan objek, pencarian sedikit lebih cepat daripada SortedDictionary. Sekali lagi saya akan menggunakan ini dalam situasi di mana Anda ingin pencarian cepat dan ingin mempertahankan koleksi dalam urutan berdasarkan kunci, dan di mana penyisipan dan penghapusan jarang terjadi.
Ringkasan tentatif dari Prosedur yang mendasari
Umpan balik sangat kami terima karena saya yakin saya tidak melakukan semuanya dengan benar.
- Semua array berukuran
n
.
- Array yang tidak diurutkan = .Add / .Remove adalah O (1), tetapi .Item (i) adalah O (n).
- Array yang diurutkan = .Add / .Remove adalah O (n), tetapi .Item (i) adalah O (log n).
Kamus
Penyimpanan
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Menambahkan
- Tambahkan
HashArray(n) = Key.GetHash
# O (1)
- Tambahkan
KeyArray(n) = PointerToKey
# O (1)
- Tambahkan
ItemArray(n) = PointerToItem
# O (1)
Menghapus
For i = 0 to n
, temukan di i
mana HashArray(i) = Key.GetHash
# O (log n) (array terurut)
- Hapus
HashArray(i)
# O (n) (array diurutkan)
- Hapus
KeyArray(i)
# O (1)
- Hapus
ItemArray(i)
# O (1)
Dapatkan Item
For i = 0 to n
, temukan di i
mana HashArray(i) = Key.GetHash
# O (log n) (array terurut)
- Kembali
ItemArray(i)
Loop Through
For i = 0 to n
, kembali ItemArray(i)
SortedDictionary
Penyimpanan
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Menambahkan
- Tambahkan
KeyArray(n) = PointerToKey
# O (1)
- Menambahkan
ItemArray(n) = PointerToItem
# O (1)
For i = 0 to n
, temukan di i
manaKeyArray(i-1) < Key < KeyArray(i)
(menggunakan ICompare
) # O (n)
- Menambahkan
OrderArray(i) = n
# O (n) (array diurutkan)
Menghapus
For i = 0 to n
, Temukan i
mana KeyArray(i).GetHash = Key.GetHash
# O (n)
- Menghapus
KeyArray(SortArray(i))
# O (n)
- Menghapus
ItemArray(SortArray(i))
# O (n)
- Menghapus
OrderArray(i)
# O (n) (array diurutkan)
Dapatkan Item
For i = 0 to n
, Temukan i
mana KeyArray(i).GetHash = Key.GetHash
# O (n)
- Kembali
ItemArray(i)
Loop Through
For i = 0 to n
, kembali ItemArray(OrderArray(i))
SortedList
Penyimpanan
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Menambahkan
For i = 0 to n
, temukan di i
manaKeyArray(i-1) < Key < KeyArray(i)
(menggunakan ICompare
) # O (log n)
- Menambahkan
KeyArray(i) = PointerToKey
# O (n)
- Menambahkan
ItemArray(i) = PointerToItem
# O (n)
Menghapus
For i = 0 to n
, Temukan i
mana KeyArray(i).GetHash = Key.GetHash
# O (log n)
- Menghapus
KeyArray(i)
# O (n)
- Hapus
ItemArray(i)
# O (n)
Dapatkan Item
For i = 0 to n
, temukan di i
manaKeyArray(i).GetHash = Key.GetHash
# O (log n)
- Kembali
ItemArray(i)
Loop Through
For i = 0 to n
, kembali ItemArray(i)