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

C#字典TryGetValue与int值,如何避免双重查找,c#,dictionary,out,trygetvalue,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; } 是否有任何方法可以避免索引查找以替换现有值

在执行以下操作时:

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);
    }
(免责声明:不执行
if(条件)
检查-我很少遇到这些情况)

您可以尝试一下

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

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

您不会查找两次。@DanielA.White:使用索引器进行查找IIRC;PDO您的(状况)取决于
?@G.Stoynev是的,它做了一个比较。考虑到您的小问题,我个人更喜欢
dict.Add(key,0)
而不是
dict[key]=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;
}