有没有更安全的方式添加一个项目到Dictionary <>?

我需要添加键/对象对字典,但我当然需要先检查是否已经存在的密钥,否则我得到一个“ 密钥已经存在字典 ”的错误。 下面的代码解决了这个问题,但是笨重。

没有像这样做一个string帮助器方法是什么更优雅的方式呢?

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

只要使用索引器 – 它会覆盖,如果它已经存在,但它不必先在那里:

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

基本上使用Add如果键的存在表明一个错误(所以你想它扔),否则索引器。 (这与转换和使用参考转换之间的区别有点像。)

如果您使用的是C#3, 并且您拥有一组不同的密钥 ,则可以使其更加整洁:

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

这不会在你的情况下工作,因为集合初始化器总是使用Add来抛出第二个Customers条目。

怎么了…

 dict[key] = view; 

它会自动添encryption钥,如果它不存在。

只是

 dict[key] = view; 

从Dictionary.Item的MSDN文档

与指定键相关联的值。 如果未find指定的键,则get操作将抛出KeyNotFoundExceptionexception, set操作将使用指定的键创build一个新元素

我的重点

像往常一样,John Skeet以正确的答案进入照明​​速度,但有趣的是,您也可以将您的SafeAdd作为IDictionary的扩展方法编写。

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

尽pipe使用索引器显然是针对您的特定问题的正确答案,但是向现有types添加附加function的另一个更一般的答案是定义扩展方法。

显而易见,这不是一个特别有用的例子,但下一次你发现一个真正的需要时要记住一些事情:

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