辞書TryGetValueとContainsKey+Itemのどちらが効率的ですか? 質問する

辞書TryGetValueとContainsKey+Itemのどちらが効率的ですか? 質問する

MSDNのエントリよりDictionary.TryGetValue メソッド:

このメソッドは、ContainsKey メソッドと Item プロパティの機能を組み合わせます。

キーが見つからない場合、値パラメータは値型 TValue の適切なデフォルト値を取得します。たとえば、整数型の場合は 0 (ゼロ)、ブール型の場合は false、参照型の場合は null になります。

コードが辞書にないキーに頻繁にアクセスしようとする場合は、TryGetValue メソッドを使用します。このメソッドを使用すると、Item プロパティによってスローされる KeyNotFoundException をキャッチするよりも効率的です。

この方法はO(1)演算に近づきます。

説明からは、ContainsKey を呼び出して検索を行うよりも効率的か、単に便利なだけかは明らかではありません。 の実装は、TryGetValueContainsKey を呼び出して Item を呼び出すだけでしょうか、それとも単一の検索を行う方が実際には効率的でしょうか?

言い換えれば、どちらがより効率的か(つまり、どちらがより少ない検索を実行するか):

Dictionary<int,int> dict;
//...//
int ival;
if(dict.ContainsKey(ikey))
{
  ival = dict[ikey];
}
else
{
  ival = default(int);
}

または

Dictionary<int,int> dict;
//...//
int ival;
dict.TryGetValue(ikey, out ival);

注: ベンチマークを探しているわけではありません。

ベストアンサー1

TryGetValue速くなります。

ContainsKeyは と同じチェックを使用しますTryGetValue。これは内部的に実際のエントリの場所を参照します。Itemプロパティは実際には とほぼ同じコード機能を持ちますがTryGetValue、false を返す代わりに例外をスローする点が異なります。

ContainsKeyに続けてを使用するとItem、基本的にルックアップ機能が複製され、この場合の計算の大部分がこれになります。

おすすめ記事