当我执行 val = dict["nonexistent key"] 时,我得到 System.Collections.Generic.KeyNotFoundException 有没有办法让我的字典以键作为参数调用成员函数来生成值?
-edit- 也许我应该更具体。我想自动调用一个成员函数来做它需要为该键创建正确的值。在这种情况下,它会在我的数据库中创建一个条目,然后将其独特的句柄返回给我。我将在下面发布我的解决方案。
当我执行 val = dict["nonexistent key"] 时,我得到 System.Collections.Generic.KeyNotFoundException 有没有办法让我的字典以键作为参数调用成员函数来生成值?
-edit- 也许我应该更具体。我想自动调用一个成员函数来做它需要为该键创建正确的值。在这种情况下,它会在我的数据库中创建一个条目,然后将其独特的句柄返回给我。我将在下面发布我的解决方案。
使用扩展方法:
static class DictionaryExtensions {
public static TValue GetValueOrDefault<TKey, TValue>(this Dictionary<TKey,TValue> dic, TKey key, Func<TKey, TValue> valueGenerator) {
TValue val;
if (dic.TryGetValue(key, out val))
return val;
return valueGenerator(key);
}
}
您可以使用以下命令调用它:
dic.GetValueOrDefault("nonexistent key", key => "null");
或者传递一个成员函数:
dic.GetValueOrDefault("nonexistent key", MyMemberFunction);
Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
// this only works when key is found..
}
// no exception is thrown here..
顺便说一句,您所说的技术称为记忆化
TryGetValue() 很好。如果您不受性能限制或不需要该值,也可以使用 ContainsKey()。
string Q = "nonexistent key";
string A = "";
if(dict.containskey(Q))
{
A= dict[Q];
}
else
{
//handler code here
}
if(myDictionary.ContainsKey("TestKey")
{
System.Print(myDictionary["TestKey"]);
}
public class MyDictionary<K, V>
{
Dictionary<K, V> o = new Dictionary<K, V>();
public delegate V NonExistentKey(K k);
NonExistentKey nonExistentKey;
public MyDictionary(NonExistentKey nonExistentKey_)
{ o = new Dictionary<K, V>();
nonExistentKey = nonExistentKey_;
}
public V this[K k]
{
get {
V v;
if (!o.TryGetValue(k, out v))
{
v = nonExistentKey(k);
o[k] = v;
}
return v;
}
set {o[k] = value;}
}
}