我刚刚注意到Dictionary.TryGetValue(TKey key, out TValue value)
并且很好奇哪种方法可以从字典中检索值。
我传统上做过:
if (myDict.Contains(someKey))
someVal = myDict[someKey];
...
除非我知道 在那里。
这样做会更好:
if (myDict.TryGetValue(somekey, out someVal)
...
哪种更好的做法?一个比另一个快吗?我会想象Try版本会慢一些,因为它'swallowing'是一个try / catch本身并将其用作逻辑,不是吗?
答案 0 :(得分:84)
TryGetValue略快,因为FindEntry只会被调用一次。
快多少?这取决于 手头的数据集。当你打电话给 包含方法,Dictionary做了 内部搜索以查找其索引。如果 它返回true,你需要另一个 索引搜索以获取实际值。 当您使用TryGetValue时,它会搜索 只有一次索引,如果找到, 它将值赋给变量。
仅供参考:它实际上并没有发现错误。
它在呼唤:
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;
}
ContainsKey是这样的:
public bool ContainsKey(TKey key)
{
return (this.FindEntry(key) >= 0);
}
答案 1 :(得分:29)
实际上TryGetValue更快。多快了?这取决于手头的数据集。当您调用Contains方法时,Dictionary会执行内部搜索以查找其索引。如果返回true,则需要另一个索引搜索来获取实际值。当您使用TryGetValue时,它只搜索一次索引,如果找到,它会将值赋给您的变量。
修改强>
好的,我理解你的困惑所以让我详细说明:
案例1:
if (myDict.Contains(someKey))
someVal = myDict[someKey];
在这种情况下,有2个调用FindEntry,一个用于检查密钥是否存在,还有一个用于检索它
案例2:
myDict.TryGetValue(somekey, out someVal)
在这种情况下,只有一次对FindKey的调用,因为结果索引是以相同的方法保存用于实际检索的。
答案 2 :(得分:0)
我认为trygetvalue正在做更多的事情:
if(myDict.ReallyOptimisedVersionofContains(someKey))
{
someVal = myDict[someKey];
return true;
}
return false;
所以希望没有尝试/抓住任何地方。
我认为这只是一种方便的方法。我通常使用它,因为它保存了一行或两行代码。
答案 3 :(得分:0)
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);
}
如您所见,TryGetValue 与 ContainsKey + 一个数组查找相同。
如果您的逻辑只是检查该键是否存在于字典中,而没有其他与该键相关的内容(取该键的值),您应该使用 ContainsKey。
尝试检查这个类似的问题:is-there-a-reason-why-one-should-use-containskey-over-trygetvalue