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

时间:2013-04-09 13:49:32

标签: c# dictionary out trygetvalue

做类似的事情时:

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

3 个答案:

答案 0 :(得分:4)

  

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

不是我知道的 - 但字典访问应该非常快,除非你有一个被忽略的自定义类GetHashCode

如果由于双重查找而没有看到性能问题,我会不理会。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

你可以尝试一下

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

故事的本质是,您获取的类型是泛型类型并在堆上分配。即当你把它拿出来时,它就会变成价值。但是,如果您获取对象,它将是对原始分配对象的引用,您可以修改对象的特定属性的值。