2008-12-18 66 views
74

我剛剛注意到Dictionary.TryGetValue(TKey key, out TValue value),並好奇哪種檢索字典中的值的方法更好。檢索字典值最佳實踐

我做傳統:

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

,除非我知道它是在那裏。

是更好地只是做:

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

哪個是更好的做法?一個比另一個快嗎?我會想象一下,Try版本會慢一點,因爲它吞噬了一個try/catch本身,並用它作爲邏輯,不是嗎?

謝謝!

回答

79

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); 
} 
+0

TryGetValue稍快,因爲FindEntry只會被調用一次。 – Joe 2008-12-18 17:09:36

+1

當你有一個大的字典時,TryGetValue會快得多 – Diadistis 2008-12-18 17:11:07

0

我想象trygetvalue做更多的東西一樣:

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

所以希望沒有try/catch語句的任何地方。

我認爲這只是一種方便的方法。我通常使用它,因爲它保存了一行或兩行代碼。

26

事實上,TryGetValue更快。快多少?這取決於手頭的數據集。當您調用Contains方法時,Dictionary將執行內部搜索以查找其索引。如果它返回true,則需要進行另一次索引搜索才能獲得實際值。當您使用TryGetValue時,它只會搜索一次索引,如果找到,它會將值分配給您的變量。

編輯:

好吧,我明白你的困惑,所以讓我闡述:

案例1:

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

在這種情況下,有2個來電FindEntry,一個檢查密鑰是否存在以及是否存在密鑰

情況2:

myDict.TryGetValue(somekey, out someVal) 

在這種情況下,只有一個呼叫到FindKey因爲得到的索引被保持在相同的方法實際進行檢索。