我刚刚注意到Dictionary.TryGetValue(TKey key, out TValue value)
并且很好奇哪个是从Dictionary中检索值的更好方法.
我传统上做了:
if (myDict.Contains(someKey)) someVal = myDict[someKey]; ...
除非我知道它有必要在里面.
做的更好:
if (myDict.TryGetValue(somekey, out someVal) ...
哪种更好的做法?一个比另一个快吗?我会想象Try版本会慢一些,因为它'swallowing'是一个try/catch本身并将其用作逻辑,不是吗?
TryGetValue略快,因为FindEntry只会被调用一次.
多快了?这取决于手头的数据集.当您调用Contains方法时,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); }
事实上,TryGetValue更快.多快了?这取决于手头的数据集.当您调用Contains方法时,Dictionary会执行内部搜索以查找其索引.如果返回true,则需要另一个索引搜索来获取实际值.当您使用TryGetValue时,它只搜索一次索引,如果找到,它会将值赋给您的变量.
编辑:
好的,我理解你的困惑所以让我详细说明:
情况1:
if (myDict.Contains(someKey)) someVal = myDict[someKey];
在这种情况下,有2个调用FindEntry,一个用于检查密钥是否存在,另一个用于检索它
案例2:
myDict.TryGetValue(somekey, out someVal)
在这种情况下,只有一次调用FindKey,因为结果索引保留在同一方法中的实际检索中.