字典TryGetValue与int值,如何避免双重查找

本文关键字:何避免 查找 TryGetValue int 字典 | 更新日期: 2023-09-27 18:08:20

int value;
if (dict.TryGetValue(key, out value))
{
    if (condition)
    {
        //value = 0;  this copies by value so it doesn't change the existing value
        dict[key] = 0;
    }
}
else
{
    dict[key] = 0;
}

是否有任何方法可以避免索引查找以替换现有值?我已经使用TryGetValue验证了密钥的存在,所以再次通过索引检索值似乎是一种浪费。

在一个单独的注意事项上,在我的代码的else{}部分,它通常被认为是好的做法使用索引器时添加新的或替换旧的值,并添加,以明确您是添加而不是替换?或者我应该每次都使用索引器?我学会使用字典的方式,我总是做一个TryGetValue查找,在else部分,我处理没有键存在的情况。

字典TryGetValue与int值,如何避免双重查找

是否有任何方法可以避免索引查找以替换现有值?

我不知道-但是字典访问应该非常快,除非你有一个自定义类重写GetHashCode很差。

如果你没有看到性能问题,因为双重查找,我不去管它。

你可以试试

Object value;
if (dict.TryGetValue(key, out value))
{
    if (condition)
    {
        //value.data = 0;  this copies by value so it doesn't change the existing value
        value.data = 0;
    }
}
else
{
    value.data = 0;
}

这个故事的本质是,你取出的类型是一个泛型类型,并且是在堆上分配的。也就是说,当你取出它的时候,它会以value的形式出现。但是,如果您取出object,它将是对原始分配对象的引用,并且您可以修改object的特定属性的值。

我更喜欢为这样的事情定义方便的扩展方法。例如:

    public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue defaultValue)
    {
        TValue value;
        return dictionary.TryGetValue(key, out value) ? value : defaultValue;
    }
    public static TValue GetOrSet<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
    {
        return dictionary[key] = dictionary.GetValueOrDefault(key, value);
    }

几乎不需要担心字典哈希的性能&查找——我主要关心的是可读性和可维护性。使用上述扩展方法,这类事情只需一行代码:

int value = dict.GetOrSet(key, 0);

(免责声明:不执行if (condition)检查-我很少遇到这些情况)