Sözlüğe yeni bir öğe ekleme veya mevcut öğeyi güncelleme yöntemi


235

Bazı eski kodda, anahtar zaten mevcutsa, yeni bir anahtar / değer öğesi eklemeyi veya değeri güncellemeyi kolaylaştırmak için aşağıdaki uzantı yöntemini gördüm.

Yöntem-1 (eski kod).

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);
    }
}

Yine de, map[key]=value aynı işi yaptığını kontrol ettim . Yani, bu yöntem aşağıdaki Yöntem-2 ile değiştirilebilir.

Yöntem-2.

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

Şimdi sorum şu: Yöntem-1'i Yöntem-2 ile değiştirirsem herhangi bir sorun olabilir mi? Olası bir senaryoda kırılacak mı?

Ayrıca, bu eskiden HashTable ve Sözlük arasındaki fark olduğunu düşünüyorum. HashTable, bir öğeyi güncellemeye veya Sözlük yapmıyorken indexer kullanarak yeni bir öğe eklemeye izin verir Bu fark C #> 3.0 sürümlerinde ortadan kaldırıldı mı?

Kullanıcı aynı anahtar / değer çiftini tekrar gönderirse, bu yöntemin amacı çok fazla istisna değildir, yöntem yalnızca girdiyi yeni değerle güncelleştirmeli ve yönteme yeni anahtar / değer çifti gönderildiyse yeni bir giriş yapmalıdır. .

Yanıtlar:


243

Yöntem-1'i Yöntem-2 ile değiştirirsem herhangi bir sorun olabilir mi?

Hayır, sadece kullan map[key] = value. İki seçenek eşdeğerdir.


Vs. Dictionary<>ile ilgili olarak Hashtable: Reflector uygulamasını başlattığınızda, her iki sınıfın dizin oluşturucu ayarlayıcılarının çağrıldığını this.Insert(key, value, add: false);ve addparametrenin, yinelenen bir anahtar eklerken bir istisna atmaktan sorumlu olduğunu görürsünüz . Yani davranış her iki sınıf için de aynıdır.


44

Sorun yok. Hatta CreateNewOrUpdateExistingkaynaktan kaldırmak ve map[key] = valuedoğrudan kodunuzda kullanmak istiyorum, çünkü bu çok daha okunabilir, çünkü geliştiriciler genellikle ne map[key] = valueanlama geldiğini biliyordu .


22

Eski bir soru ama ben, daha da eklemek gerekir hissediyorum çünkü daha .net 4.0 zaten soru yazıldığı anda başlattı.

.Net 4.0'dan başlayarak System.Collections.Concurrent, iş parçacığı açısından güvenli koleksiyonlar içeren bir ad alanı vardır.

Koleksiyon System.Collections.Concurrent.ConcurrentDictionary<>tam olarak istediğinizi yapar. İş AddOrUpdate()parçacığı için güvenli olma avantajı ile bir yöntem vardır.

Yüksek performanslı bir senaryodaysanız ve birden fazla iş parçacığını işlemiyorsanız, verilen yanıtlar map[key] = valuedaha hızlıdır.

Çoğu senaryoda bu performans avantajı önemsizdir. Eğer öyleyse ben ConcurrentDictionary kullanmanızı öneririz çünkü:

  1. Bu çerçevede - Daha test edilir ve kodu korumak zorunda olan siz değilsiniz
  2. Ölçeklenebilir: çoklu iş parçacığına geçerseniz, kodunuz zaten hazırdır

7

İşlevsel olarak eşdeğerdirler.

map[key] = valueİki kişi yerine yalnızca tek bir arama yaptığınızdan, performans açısından daha hızlı olur.

Stil olarak, daha kısa daha iyi :)

Kod çoğu durumda çok iş parçacıklı bağlamda iyi çalışıyor gibi görünecektir. Ancak, ekstra senkronizasyon olmadan iş parçacığı için güvenli değildir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.