检索字典值最佳实践

时间:2008-12-18 16:48:36

标签: c# .net dictionary

我刚刚注意到Dictionary.TryGetValue(TKey key, out TValue value)并且很好奇哪种方法可以从字典中检索值。

我传统上做过:

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

除非我知道 在那里。

这样做会更好:

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

哪种更好的做法?一个比另一个快吗?我会想象Try版本会慢一些,因为它'swallowing'是一个try / catch本身并将其用作逻辑,不是吗?

4 个答案:

答案 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