2010-11-22 19 views
155

在一些遺留代碼中,我已經看到以下擴展方法,以便於添加新的鍵值項或更新值(如果鍵已經存在)。方法-1(傳統代碼)。在字典中添加新的或更新現有項目的方法

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

雖然,我已檢查map[key]=value是否完全一樣的工作。也就是說,這種方法可以用下面的方法-2代替。方法-2。

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

現在,我的問題是..如果我用方法2替換方法1,可以有任何問題嗎?它會在任何可能的情況下破裂嗎?

此外,我認爲這曾經是HashTable和Dictionary之間的區別。 HashTable允許更新一個項目,或者使用索引器添加一個新項目,而Dictionary不會!這種差異在C#> 3.0版本中被消除了嗎?

如果用戶再次發送相同的鍵值,該方法的目標不是太拋出異常,該方法應該只更新具有新值的條目,並且如果新鍵值對已經被創建爲新條目發送到該方法。

回答

153

如果我用Method-2替換Method-1,會有什麼問題嗎?

不,請使用map[key] = value。這兩個選項是相同的。


關於Dictionary<>Hashtable:當你開始反射,看到兩個類的索引制定者調用this.Insert(key, value, /* add */ false);add參數負責拋出異常,插入重複鍵時。所以這兩個類的行爲都是一樣的。

29

沒有問題。我甚至會從源代碼中刪除CreateNewOrUpdateExisting,並在代碼中直接使用map[key] = value,因爲這樣可讀性更強,因爲開發人員通常會知道map[key] = value的含義。

5

在功能上它們是等效的。

性能明智map[key] = value會更快,因爲您只是進行單一查詢而不是兩個。

風格明智的,更短的在大多數情況下更好:)

代碼將似乎在多線程方面做工精細。但它是而不是線程安全,沒有額外的同步。

13

老問題,但我覺得我應該加入以下內容,甚至更多,因爲.net 4.0已經在問題寫入時啓動。

從.net 4.0開始,有名稱空間System.Collections.Concurrent,其中包含線程安全的集合。

集合System.Collections.Concurrent.ConcurrentDictionary<>正是你想要的。它的AddOrUpdate()方法具有線程安全的附加優勢。

如果您處於高性能場景而不處理多個線程,那麼map[key] = value的已知答案會更快。

在大多數情況下,這種性能優勢是微不足道的。如果是的話我建議使用ConcurrentDictionary因爲:

  1. 它是框架 - 它更測試,你是不是誰擁有維護代碼
  2. 它是可擴展的一個:如果切換到多線程你的代碼已經準備好了吧
相關問題