2017-06-30 6 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になります。

重複にそこに行くされている場合、Iは、制御フローを処理するために使用される場合try/catchsmall performance penaltyを招くながらContainsKeyは、O(1)操作であるように、第一の方法となるだろう。おそらく、このペナルティはO(1)より大きくなるでしょう。

dictionaryKeyを重複しないように保証できる場合は、2番目の方法が高速になります。 try/catchパフォーマンスペナルティは、例外がスローされた場合にのみ発生します(重複キーが検出された場合)。最初の方法は、ContainsKeyへの不要な呼び出しを実行することです。もちろん、これは最初にtry/catchにコードをラップする必要はなく、質問の目的を破っていることを意味します。

私は最初の方法に行きます。

関連する問題