我需要将键/对象对添加到字典中,但是我当然需要先检查键是否已存在,否则会收到“ 键在字典中已存在”错误。下面的代码解决了这个问题,但是很笨拙。
什么是更优雅的方法,而无需创建这样的字符串助手方法?
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;
}
}
}
}
只需使用索引器-如果它已经存在,它将被覆盖,但是它没有have首先存在:
Dictionary<string, object> currentViews = new Dictionary<string, object>();
currentViews["Customers"] = "view1";
currentViews["Customers"] = "view2";
currentViews["Employees"] = "view1";
currentViews["Reports"] = "view1";
如果键的存在指示错误(因此您要抛出),则基本使用Add
,否则使用索引器。 (有点像强制转换和使用as
进行参考转换之间的区别。)
如果您使用的是C#3 并且有一组独特的键,则可以使它更加整洁:
var currentViews = new Dictionary<string, object>()
{
{ "Customers", "view2" },
{ "Employees", "view1" },
{ "Reports", "view1" },
};
但是,这在您的情况下不起作用,因为集合初始值设定项始终使用Add
,它将引发第二个Customers
条目。
怎么了...
dict[key] = view;
如果不存在,它将自动添加密钥。
简单
dict[key] = view;
摘自Dictionary.Item的MSDN文档
与指定的密钥。如果指定的键是找不到,get操作将引发KeyNotFoundException和set操作创建一个新元素指定的键。
我的重点
像往常一样,约翰·斯凯特(John Skeet)以正确的答案进入照明速度,但是有趣的是,您也可以在IDictionary上编写SafeAdd作为扩展方法。
public static void SafeAdd(this IDictionary<K, T>. dict, K key, T value)...
尽管显然使用索引器是解决您特定问题的正确方法,但是对于向现有类型添加附加功能的问题的另一个更一般的答案是定义扩展方法。
显然,这不是一个特别有用的示例,但是下次您发现真正需要时要牢记一点:
public static class DictionaryExtensions
{
public static void SafeAdd<TKey, TValue>(this Dictionary<TKey, TValue> dict,
TKey key, TValue value)
{
dict[key] = value;
}
}