2

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

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

但它会导致:“给定的键不在字典中。

有什么方法可以像我为会话分配值的方式一样,使用空合并为该字典分配值:

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

谢谢

编辑:我实际上试图从字典的子类中覆盖索引器,但无济于事。实现 IDictionary 接口似乎太多了,因为我们只需要下面代码的功能(即,如果未找到键,则返回 null)。所以我想,也许我们可以使用如下扩展:

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

但它不工作甚至编译。

还有其他更简单的方法可以重用这个索引器功能吗?非常感谢。

4

2 回答 2

1

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

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

编辑:

并回答您的问题;您可以创建自己的索引器或实现 IDictionary 接口。这样你可以避免抛出异常的默认行为

于 2010-06-25T06:04:00.300 回答
1

如果您想内联执行此操作:

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";
于 2010-06-25T06:05:43.437 回答