在某些情况下,当字典中没有按键访问字典值时,使用一种简短的、可读的方法来获取 null
而不是 KeyNotFoundException
对我来说似乎是有用的。
我首先想到的是一种扩展方法:
public static U GetValueByKeyOrNull<T, U>(this Dictionary<T, U> dict, T key)
where U : class //it's acceptable for me to have this constraint
{
if (dict.ContainsKey(key))
return dict[key];
else
//it could be default(U) to use without U class constraint
//however, I didn't need this.
return null;
}
但实际上,当你写下这样的东西时,它并不是很简短:
string.Format("{0}:{1};{2}:{3}",
dict.GetValueByKeyOrNull("key1"),
dict.GetValueByKeyOrNull("key2"),
dict.GetValueByKeyOrNull("key3"),
dict.GetValueByKeyOrNull("key4"));
我想说,最好有一些接近基本语法的东西: dict["key4"]
。
然后,我想出了一个创建一个具有 private
字典字段的类的想法,该字段公开了我需要的功能:
public class MyDictionary<T, U> //here I may add any of interfaces, implemented
//by dictionary itself to get an opportunity to,
//say, use foreach, etc. and implement them
// using the dictionary field.
where U : class
{
private Dictionary<T, U> dict;
public MyDictionary()
{
dict = new Dictionary<T, U>();
}
public U this[T key]
{
get
{
if (dict.ContainsKey(key))
return dict[key];
else
return null;
}
set
{
dict[key] = value;
}
}
}
但是,要获得基本行为上的细微变化,似乎有点费力。
另一个解决方案是在当前上下文中定义一个 Func
,如下所示:
Func<string, string> GetDictValueByKeyOrNull = (key) =>
{
if (dict.ContainsKey(key))
return dict[key];
else
return null;
};
所以它可以像 GetDictValueByKeyOrNull("key1")
一样被利用。
你能给我更多的建议或帮助我选择一个更好的吗?