Saya menemukan itu SortedList<TKey, TValue>
SortedDictionary<TKey, TValue>
danDictionary<TKey, TValue>
menerapkan antarmuka yang sama.
- Kapan kita harus memilih
SortedList
danSortedDictionary
kembaliDictionary
? - Apa perbedaan antara
SortedList
danSortedDictionary
dalam hal penerapan?
c#
generics
dictionary
sortedlist
sorteddictionary
Memisahkan
sumber
sumber
Jawaban:
Saat melakukan iterasi terhadap elemen di salah satu dari keduanya, elemen akan diurutkan. Tidak demikian halnya dengan
Dictionary<T,V>
.MSDN membahas perbedaan antara
SortedList<T,V>
danSortedDictionary<T,V>
:sumber
SortedList
Anda dapat mengambil dengan indeks (sebagai lawan pengambilan dengan kunci) danSortedDictionary
Anda tidak bisa.Saya akan menyebutkan perbedaan antar kamus.
Gambar di atas menunjukkan itu
Dictionary<K,V>
dalam setiap kasus sama atau lebih cepat daripadaSorted
analog, tetapi jika urutan elemen diperlukan, misalnya untuk mencetaknya,Sorted
dipilih satu.Src: http://people.cs.aau.dk/~normark/oop-csharp/html/notes/collections-note-time-complexity-dictionaries.html
sumber
Immutable
versi dari kamus-kamus ini, bahwaSorted
versinya seringkali lebih cepat sekitar 40-50% daripada versi yang tidak diurutkan (tetapO(log(n))
, tetapi terasa lebih cepat per op) . Pengaturan waktu mungkin berbeda tergantung pada bagaimana input diurutkan. Lihat stackoverflow.com/a/30638592/111575Untuk meringkas hasil Tes Performa - SortedList vs. SortedDictionary vs. Dictionary vs. Hashtable , hasil dari yang terbaik hingga terburuk untuk skenario yang berbeda:
Penggunaan Memori:
Sisipan:
Operasi Pencarian:
untuk setiap operasi loop
sumber
Collection
perlu,sorted
Anda dapat melupakanHashtable
danDictionary
: jika Anda mengisi Koleksi dalam satu kesempatan -> pilih SortedList, tetapi jika Anda mengantisipasi, Anda akan sering perlu.Add
dan.Remove
item -> pilih SortedDictionary.sorted
dimaksud: ketika Anda melakukan danFor Each MyItem in Collection
bukannya diproses dalam urutan Anda awalnya.Add
mengedit item, asorted
Collection
akan memprosesnya dalam urutan sesuai dengan kriteria padaKey
nilai (didefinisikan dalam anIComparer
). Misalnya, jika Kunci Anda adalah String, Koleksi Anda secara default akan diproses sesuai urutan alfabet Kunci Anda, tetapi Anda selalu dapat menentukan aturan penyortiran khusus.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 JenisSystem.Collections.Generic
namespace.http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Ekstrak:
Kamus <>
SortedDictionary <>
SortedList <>
Ringkasan tentatif dari Prosedur yang mendasari
Umpan balik sangat kami terima karena saya yakin saya tidak melakukan semuanya dengan benar.
n
.Kamus
Penyimpanan
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Menambahkan
HashArray(n) = Key.GetHash
# O (1)KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)Menghapus
For i = 0 to n
, temukan dii
manaHashArray(i) = Key.GetHash
# O (log n) (array terurut)HashArray(i)
# O (n) (array diurutkan)KeyArray(i)
# O (1)ItemArray(i)
# O (1)Dapatkan Item
For i = 0 to n
, temukan dii
manaHashArray(i) = Key.GetHash
# O (log n) (array terurut)ItemArray(i)
Loop Through
For i = 0 to n
, kembaliItemArray(i)
SortedDictionary
Penyimpanan
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Menambahkan
KeyArray(n) = PointerToKey
# O (1)ItemArray(n) = PointerToItem
# O (1)For i = 0 to n
, temukan dii
manaKeyArray(i-1) < Key < KeyArray(i)
(menggunakanICompare
) # O (n)OrderArray(i) = n
# O (n) (array diurutkan)Menghapus
For i = 0 to n
, Temukani
manaKeyArray(i).GetHash = Key.GetHash
# O (n)KeyArray(SortArray(i))
# O (n)ItemArray(SortArray(i))
# O (n)OrderArray(i)
# O (n) (array diurutkan)Dapatkan Item
For i = 0 to n
, Temukani
manaKeyArray(i).GetHash = Key.GetHash
# O (n)ItemArray(i)
Loop Through
For i = 0 to n
, kembaliItemArray(OrderArray(i))
SortedList
Penyimpanan
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Menambahkan
For i = 0 to n
, temukan dii
manaKeyArray(i-1) < Key < KeyArray(i)
(menggunakanICompare
) # O (log n)KeyArray(i) = PointerToKey
# O (n)ItemArray(i) = PointerToItem
# O (n)Menghapus
For i = 0 to n
, Temukani
manaKeyArray(i).GetHash = Key.GetHash
# O (log n)KeyArray(i)
# O (n)ItemArray(i)
# O (n)Dapatkan Item
For i = 0 to n
, temukan dii
manaKeyArray(i).GetHash = Key.GetHash
# O (log n)ItemArray(i)
Loop Through
For i = 0 to n
, kembaliItemArray(i)
sumber
Saat Anda ingin koleksi diurutkan berdasarkan kunci saat Anda mengulanginya. Jika Anda tidak membutuhkan data Anda untuk disortir, Anda lebih baik hanya dengan Dictionary, itu akan memiliki kinerja yang lebih baik.
SortedList dan SortedDictionary melakukan hal yang sama, tetapi diterapkan secara berbeda, sehingga memiliki kekuatan dan kelemahan berbeda yang dijelaskan di sini .
sumber
Mencoba memberikan skor kinerja untuk setiap kasus yang disajikan oleh @Lev, saya menggunakan nilai-nilai berikut:
Hasilnya (lebih tinggi = lebih baik):
Tentu saja, setiap kasus penggunaan akan memberi bobot lebih pada operasi tertentu.
sumber