检索字典值最佳实践
我刚刚注意到Dictionary.TryGetValue(TKey key, out TValue value)
,并好奇哪个是更好的方法来从字典中检索一个值。
我传统上做了:
if (myDict.Contains(someKey)) someVal = myDict[someKey]; ...
除非我知道它必须在那里。
这样做更好吗?
if (myDict.TryGetValue(somekey, out someVal) ...
哪个更好? 一个比另一个快吗? 我可以想象,Try版本会慢一点,因为它会吞噬内部的try / catch,并将其用作逻辑,不是吗?
谢谢!
TryGetValue稍微快一点,因为FindEntry只会被调用一次。
快多less? 这取决于手头的数据集。 当您调用Contains方法时,Dictionary将执行内部search以查找其索引。 如果它返回true,则需要另外索引search来获取实际值。 当您使用TryGetValue时,它只search索引一次,如果find,它将值分配给您的variables。
仅供参考:实际上并没有发现错误。
这是呼吁:
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更快。 快多less? 这取决于手头的数据集。 当您调用Contains方法时,Dictionary将执行内部search以查找其索引。 如果它返回true,则需要另外索引search来获取实际值。 当您使用TryGetValue时,它只search索引一次,如果find,它将值分配给您的variables。
编辑:
好吧,我明白你的困惑,让我详细说明一下:
情况1:
if (myDict.Contains(someKey)) someVal = myDict[someKey];
在这种情况下,有两个调用FindEntry,一个用来检查密钥是否存在,另一个用来检索它
案例2:
myDict.TryGetValue(somekey, out someVal)
在这种情况下,只有一个对FindKey的调用,因为所产生的索引在同一个方法中保存为实际检索。
我认为trygetvalue正在做更多的事情:
if(myDict.ReallyOptimisedVersionofContains(someKey)) { someVal = myDict[someKey]; return true; } return false;
所以希望没有尝试/抓到任何地方。
我认为这只是一个方便的方法。 我通常使用它,因为它保存了一行或两行代码。