2

当我执行 val = dict["nonexistent key"] 时,我得到 System.Collections.Generic.KeyNotFoundException 有没有办法让我的字典以键作为参数调用成员函数来生成值?

-edit- 也许我应该更具体。我想自动调用一个成员函数来做它需要为该键创建正确的值。在这种情况下,它会在我的数据库中创建一个条目,然后将其独特的句柄返回给我。我将在下面发布我的解决方案。

4

7 回答 7

18

使用扩展方法:

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);
于 2009-04-05T09:07:14.660 回答
14
Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
    // this only works when key is found..
}
// no exception is thrown here..
于 2009-04-05T09:07:36.843 回答
2

顺便说一句,您所说的技术称为记忆化

于 2009-04-06T09:46:54.167 回答
1

TryGetValue() 很好。如果您不受性能限制或不需要该值,也可以使用 ContainsKey()。

于 2009-04-05T10:07:38.883 回答
1
    string Q = "nonexistent key";
    string A = "";


    if(dict.containskey(Q))
    {
        A= dict[Q];
    }
    else
    {
       //handler code here
    }
于 2009-04-05T15:18:49.697 回答
1
if(myDictionary.ContainsKey("TestKey") 
{       
  System.Print(myDictionary["TestKey"]); 
}
于 2009-04-05T15:26:12.487 回答
0
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;}
    }

}

于 2009-04-06T09:34:19.220 回答