C#字典<>丢失钥匙

时间:2009-04-05 09:03:11

标签: c# .net dictionary delegates keynotfoundexception

当我执行val = dict [“不存在的密钥”]时,我得到System.Collections.Generic.KeyNotFoundException 有没有办法让我的字典调用成员函数,并将密钥作为生成值的参数?

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

7 个答案:

答案 0 :(得分: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);

答案 1 :(得分:14)

Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
    // this only works when key is found..
}
// no exception is thrown here..

答案 2 :(得分:2)

除此之外,您所谈论的技术称为Memoization

答案 3 :(得分:1)

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

答案 4 :(得分:1)

if(myDictionary.ContainsKey("TestKey") 
{       
  System.Print(myDictionary["TestKey"]); 
}

答案 5 :(得分:0)

    string Q = "nonexistent key";
    string A = "";


    if(dict.containskey(Q))
    {
        A= dict[Q];
    }
    else
    {
       //handler code here
    }

答案 6 :(得分: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;}
    }

}