1

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

String- 原始文件名

Int - 新文件名

我阅读了TryGetValuevsContainsKey并遇到了这个:

TryGetValue方法比ContainsKey方法更快,但仅当您想要检查集合中的键并且还想要获取与其关联的值时。如果您只想检查密钥是否存在或ContainsKey仅使用。

这里

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

TryGetValue即使我不打算使用返回的,我是否应该使用value,假设字典大小将增长到 1000 个条目,并且我每次下载 ie 时都会进行重复检查。频繁地?

4

4 回答 4

4

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

现在,在实践中,这可能无关紧要,因为您正在对Dictionary可能非常小的事物进行微观优化。因此,在实践中,做最适合您和代码可读性的事情。

只是为了帮助你获得一个好主意,would grow to 1000 entries真的很小,所以在实践中它真的无关紧要。

于 2013-07-17T20:11:01.210 回答
4

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

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

于 2013-07-17T20:11:58.840 回答
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);
}

这就是这两种方法的实现方式。

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

于 2013-07-17T20:15:02.980 回答
1

我认为性能提升(如果有的话)不值得用这种优化来混淆你的代码。

平衡您的目标规模与代码可维护性。例如:

平均约 10K 并发调用 vs. < 5 个开发团队规模 加油!平均约 500 个并发呼叫与 > 50 个开发人员团队规模 不要这样做!

于 2013-07-17T20:15:26.810 回答