代码之家  ›  专栏  ›  技术社区  ›  Jronny

如何使用键索引向字典分配/添加项?

  •  1
  • Jronny  · 技术社区  · 16 年前

    我们希望使用键索引将项分配/添加到字典,如下所示:

    Dictionary<string, object> dict = new Dictionary<string, object>();
    dict["key"] = dict["key"] ?? "object";
    

    但结果是: "

    有没有什么方法可以像我使用null coalesce给会话赋值一样给这个字典赋值:

    Session["Member"] = Session["Member"] ?? new Member();
    

    谢谢

    编辑: 实际上,我试图从dictionary的子类重写索引器,但没有效果。 所以我想,也许我们可以使用这样的扩展:

    public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
        get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
        set { thisDictionary[key] = value; }
    }
    

    但它不起作用,甚至无法编译。

    有没有其他更简单的方法让我们可以重用这个索引器功能?谢谢。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Matt Mitchell    16 年前

    如果要内联执行此操作:

    dict["key"] = dict.ContainsKey("key") ? (dict["key"] ?? "object") : "object"; 
    

    dict["key"] = dict.ContainsKey("key") && dict["key"] == null ? dict["key"] : "object";
    

    按注释编辑:

    public static TValue GetSafe(this Dictionary<TKey, TValue> thisDictionary, TKey key) 
    { 
       if (!thisDictionary.ContainsKey(key))
           thisDictionary[key] = null;
    
       return thisDictionary[key];
    }
    

    这允许您执行以下操作:

    thisDictionary["randomKey"] = thisDictionary.GetSafe("randomKey") ?? "someValue";
    
        2
  •  1
  •   simendsjo    16 年前

    正如您所指出的,尝试获取丢失的键会引发异常。必须先检查密钥是否存在:

    if( !Session.ContainsKey("Member") )
        Session["Member"] = new Member();
    

    编辑: