哪种机制是扩展Dictionary以处理丢失键的更好方法,为什么?我发现自己遇到了很多小麻烦-我有一个字典,其中的值可能存在也可能不存在。所以正常的行为是使用索引器,像这样:objectresult=myDictionary["key"];但是,如果“key”不在字典中,则会抛出KeyNotFoundException,因此您可以这样做:objectval;if(!myDictionary.TryGetValue("key",outval)){val=ifNotFound;这很好,除了我可以连续加载它们-TryGetValue开始感觉笨拙得可怕。所以选项1是一个扩展方法:publicstaticTValueTryGet(thisDictionaryinput,TKeykey,TValueifNotFound=default(TValue)){TValueval;如果(input.TryGetValue(key,outval)){returnval;}返回ifNotFound;这让我做:objectresult=myDictionary.TryGet("key1")??如果没有找到;inti=anotherDictionary.TryGet("key2",-1);这很简单,但与现有实例类似地使用带有方法名称的附加扩展方法会增加混乱并降低可维护性。它还与字典的索引器集不一致——它将处理丢失的键。所以选项2是IDictionary的新实现,它从Dictionary隐式转换Dictionary但返回default(TValue)而不是抛出KeyNotFoundException的索引器。那让我做:ForgivingDictionarydict=myDictionary;objectval=dict["key"]??如果没有找到;//对val做些事情,然后...dict["key"]=val;所以现在get和set的值是Consistent的,但是值类型比较乱,ForgivingDictionary涉及到的代码也比较多。这两种方法看起来都很“混乱”——.Net中有更好的方法吗?这两种方法都会产生可能导致混淆的妥协,但是一种比另一种更明显/明确吗?为什么?在命名旨在替换现有方法的扩展方法时,我倾向于向方法名称添加特殊性而不是缩短它:GetValueOrDefault(...)对于ForgivingDictionary,您可以限制TKey,使其不能是值类型。但是如果你必须处理其中的值类型,你将返回值类型的东西,最好的选择是返回default(TKey)因为你不能返回null。老实说,我会使用扩展方法。编辑:如果找不到键,GetValueOrDefault()当然不会添加到字典中。如果找不到,我会根据它的命名方式返回一个默认值。如果有人想插入它,一个好的名字是GetValueOrInsertDefault()。我无法从您的问题中推断出找不到密钥时该怎么办。我可以想象在这种情况下不该做什么,但我也可以想象相反的情况。在任何情况下,您描述的这些TryGetValue语句系列的优雅替代方法是使用以下扩展方法之一。我提供了两个选项,具体取决于当字典不包含键时是否应该做某事:///遍历对应于指定键的所有值,///在字典中找到键。publicstaticIEnumerableTryGetValues(thisDictionarydictionary,IEnumerablekeys){TValue值;foreach(TKeykeyinkeys)if(dictionary.TryGetValue(key,outvalue))yield返回值;}///遍历指定键对应的所有值,///在字典中找到键。可以指定一个函数来处理找不到键的问题。publicstaticIEnumerableTryGetValues(thisDictionarydictionary,IEnumerablekeys,ActionnotFoundHandler){TValue值;foreach(TKeykeyinkeys)if(dictionary.TryGetValue(key,outvalue))yield返回值;否则notFoundHandler(key);}一个关于如何使用它的示例代码是:TKey[]keys=newTKey{...};foreach(TValuevalueindictionary.TryGetValues(keys)){//someactiononallvalueshere}也许以上是一个C#学习教程:哪种机制是扩展Dictionary以处理丢失键的更好方法,为什么?所有内容共享,如果对你有用,需要了解更多C#学习教程,希望你多多关注——publicstaticTValueTryGet(thisDictionaryinput,TKeykey){returninput.ContainsKey(key)?input[key]:*一些默认值*;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
