我正在实现一个简单的Dictionary<String, Int>
,用于跟踪我下载的图片文件,以及文件的重命名。
String
- 原始文件名
Int
- 新文件名
我在TryGetValue
vs ContainsKey
上阅读并发现了这一点:
TryGetValue
方法比ContainsKey
方法快,但仅限于ContainsKey
方法 你想检查集合中的密钥,也想获得价值 与之相关联。如果您只想检查密钥是否存在或 不要仅使用TryGetValue
。
来自here
因此,我想知道其他人对以下内容的看法是什么:
即使我不打算使用返回的value
,我也应该使用{{1}},假设Dictonary大小将增加到1000个条目,并且我每次下载时都会重复检查,即。经常?
答案 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开发团队规模不要做!