检索字典值最佳实践

Posted

技术标签:

【中文标题】检索字典值最佳实践【英文标题】:Retrieving Dictionary Value Best Practices 【发布时间】:2010-09-27 13:36:19 【问题描述】:

我最近才注意到Dictionary.TryGetValue(TKey key, out TValue value),我很好奇从字典中检索值的更好方法是什么。

我一直这样做:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

除非我知道它必须在里面。

这样做更好吗:

if (myDict.TryGetValue(somekey, out someVal)
    ...

哪种做法更好?一个比另一个快吗?我想 Try 版本会更慢,因为它在自身内部“吞下”一个 try/catch 并将其用作逻辑,不是吗?

【问题讨论】:

【参考方案1】:

TryGetValue 稍微快一些,因为 FindEntry 只会被调用一次。

快多少?这取决于 手头的数据集。当你打电话给 包含方法,字典做一个 内部搜索以找到它的索引。如果 它返回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 稍微快一些,因为 FindEntry 只会被调用一次。 当你有一个大字典时,TryGetValue 会快得多 理论上(好吧,实际上也是如此),这不应该取决于字典的大小,因为预期的(!)检索时间是恒定的,即与字典大小无关!【参考方案2】:

其实 TryGetValue 更快。快多少?这取决于手头的数据集。当您调用 Contains 方法时,Dictionary 会进行内部搜索以查找其索引。如果它返回 true,则需要另一个索引搜索来获取实际值。当您使用 TryGetValue 时,它​​只会搜索一次索引,如果找到,它会将值分配给您的变量。

编辑:

好的,我理解你的困惑,所以让我详细说明:

案例 1:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];

在这种情况下,有 2 次 FindEntry 调用,一次检查密钥是否存在,一次检索它

案例 2:

myDict.TryGetValue(somekey, out someVal)

在这种情况下,只有一次对 FindKey 的调用,因为结果索引被保留用于在同一方法中进行实际检索。

【讨论】:

同意。 TryGetValue 消除了进行两次密钥查找的需要。它也可以在多线程的情况下提供帮助。在您检查该值是否存在之间,它可能已被添加或删除。这可能会导致“密钥已存在”或“未找到密钥”异常。【参考方案3】:

我想 trygetvalue 正在做的事情更像:

if(myDict.ReallyOptimisedVersionofContains(someKey))
 
  someVal = myDict[someKey];
  return true;

return false;

所以希望不要在任何地方尝试/捕捉。

我认为这只是一种方便的方法。我通常使用它,因为它可以节省一两行代码。

【讨论】:

【参考方案4】:
    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

【讨论】:

以上是关于检索字典值最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

基于在 DataBrick 中的笔记本顶部提取小部件值来动态检索/过滤 Spark 框架的最佳 PySpark 实践是啥?

c# 多线程字典 - 使用一组新的值最佳实践刷新实时字典。创建新的字典,还是逐项重新加载旧的字典? [关闭]

通过c#代码检索存储在sql表中的Json值的最佳实践

DAO 级别布尔方法的最佳实践

逻辑或查找表:最佳实践

用于列表、字典等的 Python“最佳格式化实践”