1. ホーム
  2. c#

[解決済み】どちらがより効率的か。ディクショナリ TryGetValue と ContainsKey+Item のどちらが効率的ですか?

2022-03-31 10:48:40

質問

MSDN のエントリから Dictionary.TryGetValue メソッド :

このメソッドは、ContainsKey メソッドと Item プロパティ

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

TryGetValue メソッドは、コードが頻繁にアクセスしようとする場合に使用します。 キーは、ディクショナリに存在しないキーです。このメソッドを使用すると、より アイテムがスローするKeyNotFoundExceptionをキャッチするよりも効率的です。 プロパティを使用します。

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

説明からは、ContainsKeyを呼び出してからルックアップを行うよりも効率的なのか、単に便利なのかがわかりません。の実装は TryGetValue を呼び出すだけなのか、それとも1回のルックアップでそれよりも効率的なのか?

つまり、どちらがより効率的か(ルックアップの回数が少ないか)です。

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);

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

どのように解決するのですか?

TryGetValue の方が速いでしょう。

ContainsKey と同じチェックを使用します。 TryGetValue は、内部的に実際のエントリ位置を参照しています。 また Item プロパティとほぼ同じコード機能を持ちます。 TryGetValue ただし、falseを返す代わりに例外を投げます。

使用方法 ContainsKey に続いて Item は、この場合の計算の大部分であるルックアップ機能を基本的に複製しています。