2

無数の < string, double > ペアを生成し、文字列キーがまだ使用されていない場合は、それぞれを .NET ディクショナリに格納しています。

効率的には、これを行う方が良いですか?

    try { Dict.Add(key, val); }  catch (ArgumentException) {} //blind attempt

またはこれ?

    if (!Dict.ContainsKey(key)) { Dict.Add(key, val); }       //smart attempt

盲目的な試みは、複製キーで例外を引き起こします。賢明な試みでは、Dictionary インデックスを 2 回タップします。1 回目はチェックし、2 回目は追加します。(私の特定のケースでは、約 10% の確率でキーが重複しています。)

ある方法を他の方法よりも優先する必要があるかどうかを誰かが知っていますか?

4

5 に答える 5

5

一般に、例外はコストがかかります。

メンバーが例外をスローすると、そのパフォーマンスが桁違いに遅くなる可能性があります。

そうは言っても、Andrew Barber が指摘したように、これは「無数」とは何か、衝突が発生すると予想される頻度によって異なります。

確かに知るにはパフォーマンスを測定する必要がありますが、個人的には、特に例外を処理するために実際に何もせず、それを飲み込むことを計画している場合は、例外を待ってチェックする可能性があります.

于 2013-08-18T23:09:43.487 に答える
3

例外は効率的に非常に高価smart approachであり、blind attempt approach. 可能な限り例外を避けてください。

例外の非効率性の詳細については、.NET での例外の真のコストを参照してください。

于 2013-08-18T23:09:36.653 に答える
1

他の回答で述べたように、例外処理が遅くなる可能性があるため、ContainsKeyチェックを選択します。ただし、設計の観点からは、例外を使用してプログラム フローを制御することはお勧めできません。一般に、例外は例外的な場合に使用する必要があります。

重複したキーが存在する可能性があると思われる場合は、 を使用してContainsKeyください。使用されている同じキーがシステムのどこかで重大な障害を示唆するものである場合は、例外がより理にかなっている可能性があります (ただし、単にキャッチするのではなく、何かを行う必要があります)。

于 2013-08-18T23:22:57.317 に答える