Performanya hampir 100% identik. Anda dapat memeriksanya dengan membuka kelas di Reflector.net
Ini adalah pengindeks ini:
public TValue this[TKey key]
{
get
{
int index = this.FindEntry(key);
if (index >= 0)
{
return this.entries[index].value;
}
ThrowHelper.ThrowKeyNotFoundException();
return default(TValue);
}
set
{
this.Insert(key, value, false);
}
}
Dan ini adalah metode Add:
public void Add(TKey key, TValue value)
{
this.Insert(key, value, true);
}
Saya tidak akan memposting seluruh metode Sisipkan karena agak panjang, namun deklarasi metode adalah ini:
private void Insert(TKey key, TValue value, bool add)
Dan lebih jauh di dalam fungsinya, ini terjadi:
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
if (add)
{
ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate);
}
Yang memeriksa apakah kunci sudah ada, dan jika ada dan parameter yang ditambahkan benar, itu akan memunculkan pengecualian.
Jadi untuk semua tujuan dan maksud kinerjanya sama.
Seperti beberapa sebutan lainnya, ini semua tentang apakah Anda memerlukan cek tersebut, untuk upaya menambahkan kunci yang sama dua kali.
Maaf untuk posting yang panjang, saya harap tidak apa-apa.
Versi pertama akan menambahkan KeyValuePair baru ke kamus, menampilkan jika kunci sudah ada dalam kamus. Yang kedua, menggunakan pengindeks, akan menambahkan pasangan baru jika kunci tidak ada, tetapi menimpa nilai kunci jika sudah ada di kamus.
sumber
Dictionary.Add(key, value)
danDictionary[key] = value
memiliki tujuan yang berbeda:Add
metode untuk menambahkan pasangan kunci / nilai baru, kunci yang ada tidak akan diganti (danArgumentException
dilempar).sumber
Untuk menjawab pertanyaan pertama kita perlu melihat tujuan kamus dan teknologi yang mendasari.
Dictionary
adalah daftar diKeyValuePair<Tkey, Tvalue>
mana setiap nilai diwakili oleh kunci uniknya. Katakanlah kami memiliki daftar makanan favorit Anda. Setiap nilai (nama makanan) diwakili oleh kunci uniknya (posisi = seberapa Anda menyukai makanan ini).Kode contoh:
Katakanlah Anda ingin tetap sehat, Anda berubah pikiran dan Anda ingin mengganti "Burger" favorit Anda dengan salad. Daftar Anda tetap menjadi daftar favorit Anda, Anda tidak akan mengubah sifat daftar. Favorit Anda akan tetap menjadi nomor satu di daftar, hanya nilainya yang akan berubah. Ini adalah saat Anda menyebutnya:
Tapi jangan lupa Anda adalah programmernya, dan mulai sekarang Anda menyelesaikan kalimat Anda dengan; Anda menolak untuk menggunakan emoji karena akan menimbulkan kesalahan kompilasi dan semua daftar favorit berbasis indeks 0.
Diet Anda juga berubah! Jadi Anda mengubah daftar Anda lagi:
Ada dua kemungkinan dalam mendefinisikan, Anda ingin memberikan definisi baru untuk sesuatu yang belum ada sebelumnya atau Anda ingin mengubah definisi yang sudah ada.
Add method memungkinkan Anda untuk menambahkan record tetapi hanya dengan satu syarat: kunci untuk definisi ini mungkin tidak ada dalam kamus Anda.
Sekarang kita akan melihat di bawah tenda. Saat Anda membuat kamus, kompiler Anda membuat reservasi untuk bucket (spasi dalam memori untuk menyimpan catatan Anda). Bucket tidak menyimpan kunci dengan cara Anda mendefinisikannya. Setiap kunci di-hash sebelum pergi ke bucket (ditentukan oleh Microsoft), perlu disebutkan bahwa bagian nilai tetap tidak berubah.
Saya akan menggunakan algoritma hashing CRC32 untuk menyederhanakan contoh saya. Saat Anda mendefinisikan:
Apa yang akan ke ember adalah db2dc565 "Pizza" (disederhanakan).
Saat Anda mengubah nilainya dengan:
Anda hash 0 Anda yang lagi db2dc565 lalu Anda mencari nilai ini di keranjang Anda untuk menemukan apakah itu ada. Jika ada, Anda cukup menulis ulang nilai yang ditetapkan ke kunci tersebut. Jika tidak ada, Anda akan menempatkan nilai Anda di keranjang.
Saat Anda memanggil fungsi Add di kamus Anda seperti:
Anda melakukan hash 0 untuk membandingkan nilainya dengan nilai di bucket. Anda boleh memasukkannya ke dalam ember hanya jika tidak ada .
Sangat penting untuk mengetahui cara kerjanya terutama jika Anda bekerja dengan kamus kunci jenis string atau char. Peka huruf besar / kecil karena menjalani hashing. Jadi misalnya "nama"! = "Nama". Mari gunakan CRC32 kami untuk menggambarkan ini.
Nilai untuk "nama" adalah: e04112b1 Nilai untuk "Nama" adalah: 1107fb5b
sumber
Ya, itulah perbedaannya, metode Add akan mengeluarkan pengecualian jika kuncinya sudah ada.
Alasan untuk menggunakan metode Tambah persis seperti ini. Jika kamus tidak seharusnya berisi kunci tersebut, Anda biasanya menginginkan pengecualian agar Anda mengetahui masalahnya.
sumber
Mengingat, kemungkinan besar kemiripan dalam performa, gunakan apa pun yang dirasa lebih tepat dan dapat dibaca oleh bagian kode yang Anda gunakan.
Saya merasakan operasi yang mendeskripsikan penambahan, karena keberadaan kunci sudah merupakan pengecualian yang sangat langka paling baik diwakili dengan penambahan. Secara semantik, ini lebih masuk akal.
Itu
dict[key] = value
mewakili substitusi yang lebih baik. Jika saya melihat kode itu, saya setengah berharap kuncinya sudah ada di kamus.sumber
dic[key] = value
itu kuncinya sudah ada, tapi saya rasa itu bisa diperdebatkan;)Salah satunya adalah memberikan nilai sementara yang lainnya menambahkan Key and Value baru ke Dictionary.
sumber
Untuk memasukkan Nilai ke dalam Kamus
sumber