C# 字典<> 钥匙丢失

发布于 2024-07-15 22:36:55 字数 246 浏览 13 评论 0 原文

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

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

When i do val = dict["nonexistent key"] i get System.Collections.Generic.KeyNotFoundException
Is there a way i have my dictionary call a member function with the key as a param to generate a value?

-edit-
Maybe i should of been more specific. I want to AUTOMATICALLY call a member function to do what it needs create the proper value for that key. In this case it makes an entry in my DB then gives me back its unique handle. I'll post below what my solution was.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

初见你 2024-07-22 22:36:55

使用扩展方法:

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

Use an extension method:

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

You can call it with:

dic.GetValueOrDefault("nonexistent key", key => "null");

Or pass a member function:

dic.GetValueOrDefault("nonexistent key", MyMemberFunction);
清风挽心 2024-07-22 22:36:55
Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
    // this only works when key is found..
}
// no exception is thrown here..
Object value;
if(dict.TryGetValue("nonexistent key", out value))
{
    // this only works when key is found..
}
// no exception is thrown here..
舞袖。长 2024-07-22 22:36:55

顺便说一句,您正在讨论的技术称为 Memoization

Just as an aside, the technique you're talking about is called Memoization

失而复得 2024-07-22 22:36:55

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

TryGetValue() is good. You can also use ContainsKey() if you aren't performance constrained or don't need the value.

一场春暖 2024-07-22 22:36:55
if(myDictionary.ContainsKey("TestKey") 
{       
  System.Print(myDictionary["TestKey"]); 
}
if(myDictionary.ContainsKey("TestKey") 
{       
  System.Print(myDictionary["TestKey"]); 
}
不如归去 2024-07-22 22:36:55
    string Q = "nonexistent key";
    string A = "";


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


    if(dict.containskey(Q))
    {
        A= dict[Q];
    }
    else
    {
       //handler code here
    }
娇柔作态 2024-07-22 22:36:55
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;}
    }

}

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

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文