2009-03-03 177 views
50

我正在使用字典爲我正在處理的程序執行查找。我通過字典運行了一堆密鑰,我期望有些密鑰沒有價值。我發現它發生在KeyNotFoundException,並吸收它。所有其他異常將傳播到頂端。這是處理這個問題的最好方法嗎?或者我應該使用不同的查找?該字典使用int作爲其鍵,並使用自定義類作爲其值。處理KeyNotFoundException的最佳方法

回答

88

使用Dictionary.TryGetValue代替:

Dictionary<int,string> dictionary = new Dictionary<int,string>(); 
int key = 0; 
dictionary[key] = "Yes"; 

string value; 
if (dictionary.TryGetValue(key, out value)) 
{ 
    Console.WriteLine("Fetched value: {0}", value); 
} 
else 
{ 
    Console.WriteLine("No such key: {0}", key); 
} 
31

嘗試使用: Dict.ContainsKey

編輯:
明智的性能我覺得Dictionary.TryGetValue是更好,因爲一些其他的建議,但我不喜歡用的時候我沒有那麼在我看來, ContainsKey更具可讀性,但如果您還需要該值,則需要更多的代碼行。

+0

爲什麼會得到一個downvote?請解釋,以便我可以改進答案。 – Peter 2014-09-08 06:18:48

+0

你能解釋一下爲什麼你不喜歡用`out`,除非你必須? – 2015-08-26 13:51:05

+1

@wilbishardis它只是一個習慣,在我看來,我認爲它很難錯過,當你有一個=符號時,方法參數可以修改得更清晰。現在這只是我的意見,並不意味着每個人都有同感,在某些情況下,它的最佳選擇`int.TryParse`就是一個例子。 – Peter 2015-10-05 06:16:39

4

,你應該使用「的containsKey(字符串鍵)」字典的方法來檢查是否有鍵存在。 使用正常程序流程的異常不被認爲是一種好的做法。

11

這裏是一個優雅,一個在線解決方案(請記住,這使得查找的兩倍。見下文對這個tryGetValue版本應該在長時間運行的循環使用。)

string value = dictionary.ContainsKey(key) ? dictionary[key] : "default"; 

然而,我每次訪問字典時都發現自己不得不這樣做。我寧願它返回null這樣我就可以寫:

string value = dictionary[key] ?? "default";//this doesn't work 
14

一個使用TryGetValue

string value = dictionary.TryGetValue(key, out value) ? value : "No key!"; 

注意變量必須是字典,則返回在這種情況下字符串類型的在線解決方案。在這裏,您不能使用var進行變量聲明。