检索字典值最佳实践

我刚刚注意到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; 

所以希望没有尝试/抓到任何地方。

我认为这只是一个方便的方法。 我通常使用它,因为它保存了一行或两行代码。