2017-06-30 63 views
3

在這裏,我補充一下到Dictionary字典ArgumentException的日誌重複鍵:這是更好的性能?

dictionary.Add(dictionaryKey, value); 

如果dictionaryKey已存在,ArgumentException將被拋出。它的消息是相當通用的:

具有相同密鑰的項目已被添加。

如果我對dictionary.Add的調用位於循環或輔助函數中,可能很難立即告訴已添加哪個鍵引發此異常。我想盡可能快地知道這一點。

有幾個選項。

1)

if(dictionary.ContainsKey(dictionaryKey) 
{ 
    throw new ArgumentException($"An item with the same key ({dictionaryKey}) has already been added."); 
} 

dictionary.Add(dictionaryKey, value); 

2)

try 
{ 
    dictionary.Add(dictionaryKey, value); 
} 
catch(ArgumentException argumentException) 
{ 
    throw new ArgumentException($"An item with the same key ({dictionaryKey}) has already been added."); 
} 

3)我知道建立一個try/catch塊一些其他的方式

需要的性能損失,但它似乎運行dictionary.ContainsKey(dictionaryKey)這意味着每次都會進行額外的查找。哪一個選項最具性能?

+1

我會用第一種方法,因爲字典包含只有O(1)複雜性。在這種情況下不應該使用異常處理。 –

+1

Try/catch塊根本不會引發任何性能問題,這是拋出異常的原因 –

+0

不應該在錯誤消息中已經指示正在插入的內容嗎? – jth41

回答

1

不確定此代碼的上下文落在哪裏,但就性能而言,取決於您是否期望重複dictionaryKey s。

如果有要重複的,我將與第一種方法去,作爲ContainsKey是O(1)的操作,而如果用來處理控制流程try/catch招致small performance penalty。據推測,這個懲罰將大於O(1)。

但是,如果你能保證沒有重複dictionaryKey秒,第二個方法會更快。只有當一個異常被拋出時發生try/catch性能損失(重複的鍵找到)。第一種方法將被執行到ContainsKey不必要的呼叫。當然,這意味着您不需要首先將代碼包裝在try/catch中,從而擊敗了您的問題的目的。

我會去的第一個方法。