C#字典TryGetValue int值,如何避免双重查询

当做类似的事情时:

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部分处理没有密钥存在的情况。


有没有什么办法可以避免索引查找来替换现有值?

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

如果因为双重查找而没有看到性能问题,我会放弃它。


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

    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)检查 - 我很少遇到这些情况)


你可以试试这个

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

故事的本质是,你所提取的类型是一个泛型类型,并分配在堆上。 即当你取出它时,它会作为价值出现。 但是,如果您取出对象,它将是对原始分配对象的引用,您可以修改对象的特定属性的值。

链接地址: http://www.djcxy.com/p/70881.html

上一篇: C# dictionary TryGetValue with int values, how to avoid double lookup

下一篇: Why is this the program's output?