2013-06-03 36 views
1

我有一個映射字符串對象像這樣的詞典: Dictionary<string, object> myDic;字典直接訪問VS TryGetValue

之前我知道什麼對象的類型是基於字符串,但我的問題是我是否應該使用TryGetValue ,或者用try,catch語句直接查找。

例子:

//TryGetValueMethod 
object myObject = null; 
myDic.TryGetValue("test", out myObject); 

MyCustomType t1 = (MyCustomType) myObject; 

//Direct lookup method 
try 
{ 
    MyCustomType t2 = (MyCustomType) myDic["test"]; 
    //Do something here... 
} catch {} 

你覺得用什麼方法最好?第二個是更乾淨的編碼,因爲沒有額外的鑄件,但我認爲它比第一個效率低,因爲它是無異常的。

+1

預期的行爲是什麼是在字典中找不到對象? – vcsjones

+2

如果你知道這意味着什麼,你將如何使用'Dictionary '而不是'Dictionary '? –

+1

不,我可以有任何對象類型,但有一個指定的字符串,我知道值類型。例如,測試映射到MyCustomType對象test1,映射到MyCustomType2對象。 –

回答

3

我不認爲你應該使用try/catch來形成這樣的邏輯路徑。 Exception s應該是特例,哪裏出了問題。

就個人而言,我更喜歡ContainsKey

if (myDic.ContainsKey("test")) { 
    MyCustomType value = myDic["test"]; 
    // do something with the value 
} 

如果你認爲沒有找到鑰匙意味着事情已經「出了問題」,那我就省略了測試,並讓如果密鑰拋出異常未找到。

編輯:這幾天我試着用TryGetValue代替。它稍微笨拙一些,但一旦你習慣了它,它並沒有那麼糟糕。

MyCustomType value; 
if (myDic.TryGetValue("test", out value)) { 
    // do something with value 
} 
+0

是的,我認爲最好的應該是去與ContainsKey。在這種情況下,當您想要鑄造鑄件時,它比TryGetValue更乾淨。 –

+0

爲什麼要查找兩次,你可以查找一次。如果你有一個老式的電話目錄,並希望某人的電話號碼,你會看它一次,然後,如果你發現了,這是在那裏,關閉該目錄,然後再看看它嗎? –

+0

@JonHanna看到編輯 –

3

MSDN說:「使用這種方法[TryGetValue]比捕獲由Item屬性拋出的KeyNotFoundException更有效率。」

這也解釋了TryGetValue「結合ContainsKey方法和項目性質的功能」 ..

你也應該只捕獲特定的例外並不是所有的異常。

0

如果您可以安全地預測該鍵應始終存在,然後將其包裝在Try ... Catch中。這樣,只有在出現問題時纔會拋出異常。

TryGetValue是一個更好的選擇 - Dictionary.ContainsKey(key)是一樣好 - 最終它在幕後做同樣的事情TryGetValue

+1

「循環鍵,直到找到(或沒有)的關鍵」。我不認爲這是正確的。字典是一個哈希表。 'ContainsKey','TryGetValue',和索引都應該基本上O(1)的操作,而不是爲O(n)。 –

+0

它依然屹立,他們都做同樣的事情,但肯定你是對的 - 這是一個哈希表。我會修改我的答案。 – PeteGO