Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 如何使用键索引将项分配/添加到字典?_Dictionary_C# 4.0_Key_Key Value_Null Coalescing Operator - Fatal编程技术网

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

Dictionary 如何使用键索引将项分配/添加到字典?,dictionary,c#-4.0,key,key-value,null-coalescing-operator,Dictionary,C# 4.0,Key,Key Value,Null Coalescing Operator,我们希望使用键索引将项分配/添加到字典中,如下所示: Dictionary<string, object> dict = new Dictionary<string, object>(); dict["key"] = dict["key"] ?? "object"; 谢谢 编辑: 实际上,我试图从字典的子类重写索引器,但没有成功。 实现IDictionary接口似乎太多了,因为我们只需要下面代码的功能(即,如果找不到键,则返回null)。 所以我想,也许我们可以使用如下

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

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

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

public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
    get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
    set { thisDictionary[key] = value; }
}
publicstatictvalue[此字典thisDictionary,TKey]{
获取{返回thisDictionary.ContainsKey(键)?thisDictionary[key]:null;}
设置{thisDictionary[key]=value;}
}
但它不起作用,甚至无法编译


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

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

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


回答你的问题;您可以创建自己的索引器或实现IDictionary接口。通过这种方式,您可以避免在内联执行此操作时引发异常的默认行为

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

很遗憾,你不能用扩展方法隐藏默认的索引器。我不同意。如果可以用扩展方法隐藏方法,那么肯定会有一些难以追踪的bug。您不希望第三方库自动更改对象。例如,Equals。或者改变您可能依赖的IDictionary行为。这也是反对继承的理由。@Graphain:可能。。。如果不遵循Liskov的替换原则,使用继承也肯定会遇到问题。但是仅仅引用一个名称空间并在运行时以神秘的方式看到代码中断更糟糕,因为您无法控制它。我想,虽然这种情况在某种程度上已经发生了-如果您声明一个与类同名的扩展方法,您的扩展方法将不会被调用,当多个程序集声明相同的名称时,扩展方法可能会发生冲突。如果我们这样做的话,会有点多余=(取决于您是初始化对象还是引用变量。有关纯三元/无空合并的替代方案,请参阅我的更新。这与您所问的不同。您问我们是否可以使用空合并来分配字典,取决于键是否已设置。您的解决方案只是为sp设置默认值的一种方法指定的键。@Jronny,您可以设置该键是否不包含。是否类似于dict[“key”]=dict.ContainsKey(“key”)?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";