有没有一种更优雅的方法可以安全地将条目添加到 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;
}
}
}
}
103251 次浏览

怎么了..。

dict[key] = view;

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

只要使用索引器-它会覆盖,如果它已经在那里,但它不 第一:

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

如果键的存在表明存在 bug (因此您希望它抛出) ,则基本上使用 Add,否则使用索引器。(这有点像强制转换和使用 as进行引用转换之间的区别。)

如果你使用的是 C # 3 而且你有一套独特的钥匙,你可以把它做得更简洁:

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

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

很简单

dict[key] = view;

来自 Dictionary. Item 的 MSDN 文档

属性关联的值 指定的键。如果指定的键是 未找到,则 get 操作将引发 KeyNotFoundException 和 < strong > 集 操作创建一个新元素 指定的键 .

我的重点

像往常一样,John Skeet 以闪电般的速度得到了正确的答案,但有趣的是,您也可以将 SafeAdd 作为 IDictionary 的扩展方法来编写。

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