[解決済み】どちらがより効率的か。ディクショナリ TryGetValue と ContainsKey+Item のどちらが効率的ですか?
質問
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
は、この場合の計算の大部分であるルックアップ機能を基本的に複製しています。
関連
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】ORA-01008: すべての変数がバインドされていません。これらはバインドされています。
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】ユーザー設定値を別のユーザー設定値で設定する
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み】辞書にキーが含まれていない場合に例外をキャッチするのではなく、辞書にキーが含まれているかどうかを確認する方が速いのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】名前 'ViewBag' が現在のコンテキストに存在しない - Visual Studio 2015
-
[解決済み】キーが存在しない場合にデフォルト値を返すディクショナリ【重複