有没有更安全的方式添加一个项目到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; } }