Metode untuk Menambahkan baru atau memperbarui item yang ada di Kamus

235

Dalam beberapa kode lama saya telah melihat metode ekstensi berikut untuk memfasilitasi menambahkan item nilai kunci baru atau memperbarui nilai, jika kunci sudah ada.

Metode-1 (kode warisan).

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{            
    if (map.ContainsKey(key))
    {
        map[key] = value;
    }
    else
    {
        map.Add(key, value);
    }
}

Padahal, saya sudah memeriksa yang map[key]=value melakukan pekerjaan yang persis sama. Artinya, metode ini bisa diganti dengan Metode-2 di bawah ini.

Metode-2.

public static void CreateNewOrUpdateExisting<TKey, TValue>(
    this IDictionary<TKey, TValue> map, TKey key, TValue value)
{
    map[key] = value;
}

Sekarang, pertanyaan saya adalah .. Mungkinkah ada masalah jika saya mengganti Metode-1 dengan Metode-2? Apakah akan pecah dalam skenario yang memungkinkan?

Juga, saya pikir ini adalah perbedaan antara HashTable dan Kamus. HashTable memungkinkan memperbarui item, atau menambahkan item baru dengan menggunakan pengindeks sementara Kamus tidak !! Apakah perbedaan ini dihilangkan dalam versi C #> 3.0?

Tujuan dari metode ini adalah tidak terlalu melempar pengecualian jika pengguna mengirim kembali nilai kunci yang sama, metode harus memperbarui entri dengan nilai baru, dan untuk membuat entri baru jika pasangan kunci-nilai baru telah dikirim ke metode .

Manish Basantani
sumber

Jawaban:

243

Mungkinkah ada masalah jika saya mengganti Metode-1 dengan Metode-2?

Tidak, gunakan saja map[key] = value. Kedua opsi tersebut setara.


Mengenai Dictionary<>vs Hashtable.: Ketika Anda memulai Reflektor, Anda melihat bahwa pengindeks pengindeks dari kedua kelas memanggil this.Insert(key, value, add: false);dan addparameter bertanggung jawab untuk melempar pengecualian, saat memasukkan kunci duplikat. Jadi perilakunya sama untuk kedua kelas.

ulrichb
sumber
44

Tidak ada masalah. Saya bahkan akan menghapus CreateNewOrUpdateExistingdari sumber dan menggunakan map[key] = valuelangsung dalam kode Anda, karena ini ini jauh lebih mudah dibaca, karena pengembang biasanya akan tahu apa map[key] = valueartinya.

Steven
sumber
22

Pertanyaan lama tetapi saya merasa saya harus menambahkan yang berikut ini, bahkan lebih karena .net 4.0 sudah diluncurkan pada saat pertanyaan itu ditulis.

Dimulai dengan .net 4.0 ada namespace System.Collections.Concurrentyang mencakup koleksi yang aman-utas.

Koleksinya System.Collections.Concurrent.ConcurrentDictionary<>tepat seperti yang Anda inginkan. Ini memiliki AddOrUpdate()metode dengan keuntungan tambahan sebagai thread-safe.

Jika Anda berada dalam skenario kinerja tinggi dan tidak menangani banyak utas, jawaban yang sudah diberikan map[key] = valuelebih cepat.

Dalam sebagian besar skenario, manfaat kinerja ini tidak signifikan. Jika demikian saya akan menyarankan untuk menggunakan ConcurrentDictionary karena:

  1. Itu ada dalam framework - Ini lebih teruji dan Anda bukan orang yang harus menjaga kode
  2. Itu scalable: jika Anda beralih ke multithreading kode Anda sudah siap untuk itu
Luis Filipe
sumber
7

Secara fungsional, mereka setara.

Kinerja-bijaksana map[key] = valueakan lebih cepat, karena Anda hanya melakukan pencarian tunggal, bukan dua.

Dari segi gaya, semakin pendek semakin baik :)

Kode ini dalam banyak kasus kelihatannya berfungsi dengan baik dalam konteks multi-utas. Namun itu tidak aman untuk thread tanpa sinkronisasi tambahan.

ya23
sumber