C#查找的最佳IDictionary用法,可能找不到
本文关键字:找不到 用法 IDictionary 查找 最佳 | 更新日期: 2023-09-27 18:26:12
假设我有一个方法如下:
internal MyClass GetValue(long key)
{
if (_myDictionary.ContainsKey(key))
return _myDictionary[key];
return null; // Not found
}
IDictionary<long,MyClass> _myDictionary=...
但是上面的代码在字典中有两个查找:
- 密钥是否存在的测试
- 值的实际检索
有没有一种更优化的方式来表达这样一个函数,这样只执行一次查找,但"未找到"的情况仍然通过null返回来处理(即,不通过未找到的异常)?
例如,如果对键的查找返回某种可以用来检索值的迭代器,或者如果没有像C++中那样找到值,则返回一个无效的迭代程序,那就太好了。考虑到C#的语言特性,也许它有更好的方法来做到这一点。
TryGetValue
方法正是为这种情况而设计的,以避免两次查找操作。
此方法结合了ContainsKey方法和Item属性。
如果找不到键,则value参数将获得适当的值类型TValue的默认值。
[…]如果代码经常尝试访问,请使用TryGetValue方法字典里没有的键。使用此方法比捕获Item引发的KeyNotFoundException更有效所有物
internal MyClass GetValue(long key)
{
MyClass maybeValue;
// Normally, one would inspect the return value of this method
// but in this case, it's not necessary since a failed lookup
// will set the out argument to default(valType), which is null
// for a reference type - exactly what you want.
_myDictionary.TryGetValue(key, out maybeValue);
return maybeValue;
}
键入SPFiredrakes的想法。。。
public static class Extensions
{
public static TValue GetValueOrDefault<TKey, TValue>(
this IDictionary<Tkey, TValue> iDictionary, Tkey key)
{
TValue result;
return iDictionary.TryGetValue(key, out result) ? result : default(TValue)
}
}
像这个一样使用
var d = new Dictionary<long, SomeType>
{{1, new SomeType()}, {42, new SomeType()}, ...}
var value1 = d.GetValueOrDefault(1);
var value42 = d.GetValueOrDefault(42);
var valueX = d.GetValueOrDefault(10);
当然,您现在应该检查您的值是否为null
,这可能就是.Net团队省略此功能的原因。
您应该使用TryGetValue
——它使用单个查找。
internal MyClass GetValue(long key) {
MyClass res = null;
_myDictionary.TryGetValue(key, out res)
return res;
}
该调用足够短,可以在不添加包装函数的情况下使用"内联"。CCD_ 4返回指示查找是否成功的CCD_。