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=...

但是上面的代码在字典中有两个查找:

  1. 密钥是否存在的测试
  2. 值的实际检索

有没有一种更优化的方式来表达这样一个函数,这样只执行一次查找,但"未找到"的情况仍然通过null返回来处理(即,不通过未找到的异常)?

例如,如果对键的查找返回某种可以用来检索值的迭代器,或者如果没有像C++中那样找到值,则返回一个无效的迭代程序,那就太好了。考虑到C#的语言特性,也许它有更好的方法来做到这一点。

C#查找的最佳IDictionary用法,可能找不到

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_。