MSDNのエントリよりDictionary.TryGetValue メソッド:
このメソッドは、ContainsKey メソッドと Item プロパティの機能を組み合わせます。
キーが見つからない場合、値パラメータは値型 TValue の適切なデフォルト値を取得します。たとえば、整数型の場合は 0 (ゼロ)、ブール型の場合は false、参照型の場合は null になります。
コードが辞書にないキーに頻繁にアクセスしようとする場合は、TryGetValue メソッドを使用します。このメソッドを使用すると、Item プロパティによってスローされる KeyNotFoundException をキャッチするよりも効率的です。
この方法はO(1)演算に近づきます。
説明からは、ContainsKey を呼び出して検索を行うよりも効率的か、単に便利なだけかは明らかではありません。 の実装は、TryGetValue
ContainsKey を呼び出して 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
、基本的にルックアップ機能が複製され、この場合の計算の大部分がこれになります。