如何使用密钥索引将项目分配/添加到字典中?
-
29-09-2019 - |
题
我们想使用密钥索引将项目分配/添加到字典中,诸如此类:
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接口。这样,您可以避免丢弃异常的默认行为
不隶属于 StackOverflow