当你不确定是否存在某个键时,你通常会使用TryGetValue
而不是ContainsKey
加上获取索引器来避免检查两次键的开销。换句话说,代码应该是这样的:
string password;
if (accounts.TryGetValue(username, out password))
{
// use the password
}
这种方式比起这样更优:
if (accounts.ContainsKey(username))
{
string password = accounts[username];
}
如果我想在设置键值之前检查键是否已经存在怎么办?例如,我想在用新密码覆盖用户名之前检查该用户名是否已经存在:
if (!accounts.ContainsKey(username))
{
accounts.Add(username, password);
}
else
{
Console.WriteLine("Username is taken!");
}
vs
// this doesn't exist
if (!accounts.TrySetValue(username, password))
{
Console.WriteLine("Username is taken!");
}
是否有更加高效的替代方法可以代替使用ContainsKey
和Add
实现这个功能呢?
TryGetValue
调用了私有函数FindEntry
。ContainsKey
也调用了同样的私有FindEntry
函数。索引器也调用了FindEntry
。据我所知,FindEntry
看起来非常快。你对代码进行了性能分析吗?你想解决什么问题? - Sam AxeContainsKey
。键集合是经过哈希处理的,查找的预期复杂度为 O(1)。最坏情况下的复杂度是 O(n),但这只有在有很多哈希冲突的情况下才会发生(这就是为什么仔细重写GetHashCode
很重要)。我会和其他人一样建议你对代码进行性能分析。除非你试图进行“理论优化”,否则没有明确的答案。 - Grx70