8

当做类似的事情时:

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 部分我处理不存在键的情况。

4

3 回答 3

5

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

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

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

于 2013-04-09T13:53:05.780 回答
2

你可以试试这个

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

The essense of story is, the type you are fetching out is a generic type and is allocated on heap. i.e. when you fetch it out, it will come out as value. However, if you fetch out object, it will be a reference to the original allocated object and you can modify the value of a particular property of object.

于 2013-04-09T14:05:25.733 回答
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)检查 - 我很少遇到这些情况)

于 2013-04-09T13:56:33.633 回答