2009-07-24 50 views
98

我需要添加鍵/對象對字典,但我當然需要先檢查密鑰是否已經存在,否則我得到一個「密鑰已存在於字典」錯誤。下面的代碼解決了這個問題,但是笨重。有沒有更安全的將項目添加到Dictionary <>的方法?

什麼是更好的方式做到這一點,而不是像這樣的字符串幫助器方法?

using System; 
using System.Collections.Generic; 

namespace TestDictStringObject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Dictionary<string, object> currentViews = new Dictionary<string, object>(); 

      StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view1"); 
      StringHelpers.SafeDictionaryAdd(currentViews, "Customers", "view2"); 
      StringHelpers.SafeDictionaryAdd(currentViews, "Employees", "view1"); 
      StringHelpers.SafeDictionaryAdd(currentViews, "Reports", "view1"); 

      foreach (KeyValuePair<string, object> pair in currentViews) 
      { 
       Console.WriteLine("{0} {1}", pair.Key, pair.Value); 
      } 
      Console.ReadLine(); 
     } 
    } 

    public static class StringHelpers 
    { 
     public static void SafeDictionaryAdd(Dictionary<string, object> dict, string key, object view) 
     { 
      if (!dict.ContainsKey(key)) 
      { 
       dict.Add(key, view); 
      } 
      else 
      { 
       dict[key] = view; 
      } 
     } 
    } 
} 

回答

187

只需使用索引 - 如果它已經存在,它將覆蓋,但它並不是有第一:

Dictionary<string, object> currentViews = new Dictionary<string, object>(); 
currentViews["Customers"] = "view1"; 
currentViews["Customers"] = "view2"; 
currentViews["Employees"] = "view1"; 
currentViews["Reports"] = "view1"; 

基本上使用Add如果鍵的存在表明一個bug(所以你想它扔)和索引器,否則。 (這是一個有點像鑄造和引用轉換使用as之間的差)

如果您使用C#3 ,你有一組不同的鍵的,你可以讓這甚至更整潔:

var currentViews = new Dictionary<string, object>() 
{ 
    { "Customers", "view2" }, 
    { "Employees", "view1" }, 
    { "Reports", "view1" }, 
}; 

雖然這不起作用,但收集初始值設定項始終使用Add,這將引發第二個Customers條目。

+2

優秀,沒想到簡單的分配採取了加照顧/覆蓋問題,很好。 – 2009-07-24 13:17:12

36

這有什麼錯?

dict[key] = view; 

它會自動添加的關鍵,如果它是不存在的。

18

簡單地

dict[key] = view; 

從Dictionary.Item

與 指定鍵相關聯的值的MSDN文檔。如果 沒有找到指定的鍵,get操作將拋出 KeyNotFoundException和設置 操作創建一個具有 指定鍵的新元素。

我強調

8

像往常一樣,約翰·斯基特得到在那裏與正確答案照明速度,但有趣的是,你還可以這樣寫你SafeAdd作爲IDictionary的擴展方法。

public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)... 
4

雖然使用索引顯然是爲您的特定問題的正確答案,另一種更普遍的答案,以添加新的功能,以現有類型的問題是定義一個擴展方法。

Obviousy這不是格外有用的例子,但事情要記住,下一次爲您找到真正需要:

public static class DictionaryExtensions 
{ 
    public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict, 
              TKey key, TValue value) 
    { 
     dict[key] = value; 
    } 
} 
+1

我提到這隻適用於C#3.0及以上版本。 – 2009-07-24 13:20:16

相關問題