我们想使用密钥索引将项目分配/添加到字典中,诸如此类:

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

但这导致:”给定的键不存在于字典中。"

有什么方法可以使用null Cocce分配给我为会话的值的方式分配给本字典的值:

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

但是它无法正常工作,甚至没有编译。

还有其他更简单的方法,以便我们可以重复使用此索引功能吗?非常感谢。

有帮助吗?

解决方案

如果您想进行此操作:

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

其他提示

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

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

编辑:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top