字典TryGetValue不使用返回的值

时间:2013-07-17 20:08:22

标签: c# .net performance dictionary

我正在实现一个简单的Dictionary<String, Int>,用于跟踪我下载的图片文件,以及文件的重命名。

String - 原始文件名

Int - 新文件名

我在TryGetValue vs ContainsKey上阅读并发现了这一点:

  

TryGetValue方法比ContainsKey方法快,但仅限于ContainsKey方法   你想检查集合中的密钥,也想获得价值   与之相关联。如果您只想检查密钥是否存在或   不要仅使用TryGetValue

来自here

因此,我想知道其他人对以下内容的看法是什么:

即使我不打算使用返回的value,我也应该使用{{1}},假设Dictonary大小将增加到1000个条目,并且我每次下载时都会重复检查,即。经常?

4 个答案:

答案 0 :(得分:4)

  

如果您只想检查密钥是否存在,请仅使用ContainsKey。

我认为你自己回答了这个问题。

答案 1 :(得分:3)

理论上,请遵循文档。如果您不想要该值,请使用ContainsKey,因为没有代码可以实际获取内存中的值。

现在,在实践中,它可能并不重要,因为你在Dictionary上进行微观优化,这在宏观方案中可能非常小。因此,在实践中,做最适合您的事情以及代码的可读性。

为了帮助您获得一个好主意,would grow to 1000 entries 非常小,所以它在实践中并不重要。

答案 2 :(得分:1)

让我们看一下Reflector

下的两者的实现
public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}

这两种方法都是如何实现的。

现在你可以自己决定哪种方法最好。

答案 3 :(得分:1)

我认为性能提升(如果有的话)不值得使用此优化来混淆代码的成本。

平衡您的定位比例和代码可维护性。 E.g:

~10K并发呼叫平均值与&lt; 5开发团队规模为他们服务! ~500并发呼叫平均值vs.&gt; 50开发团队规模不要做!