1. ホーム
  2. c#

[解決済み] Double.TryParseとConvert.ToDouble -どちらが速く、安全か?

2022-02-11 10:41:05

質問

私のアプリケーションは、VSTOを使用してExcelファイルを読み込み、読み込んだデータを StringDictionary . これは、数桁の数字(1000 1000,2 1000,34 - ロシア標準ではカンマがデリミタ)のデータのみを追加します。

現在の文字列が適切な数値であるかどうかを確認するには、どのような方法が良いでしょうか?

object data, string key; // data had read

try
{
  Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
  dic.Add(key, regionData.ToString());
}
catch (InvalidCastException)
{
  // is not a number
}

または

double d;
string str = data.ToString();
if (Double.TryParse(str, out d)) // if done, then is a number
{
  dic.Add(key, str);
}

を使用しなければならない。 StringDictionary の代わりに Dictionary<string, double> というのは、以下のような構文解析アルゴリズムの問題があるからです。

私の質問です。どちらの方法が速いですか?どちらが安全ですか?

を呼び出す方が良いのでしょうか? Convert.ToDouble(object) または Convert.ToDouble(string) ?

解決方法は?

リリースモードで簡単に非科学的なテストをしてみました。2つの入力: "2.34523" と "badinput" を両方のメソッドに使用し、1,000,000回反復してみました。

有効な入力です。

Double.TryParse = 646ms
Convert.ToDouble = 662 ms

予想通りあまり変わりませんね。どう考えても、有効な入力の場合は、これらは同じです。

無効な入力です。

Double.TryParse = 612ms
Convert.ToDouble = ..

まあ、長いこと動いてましたからね。1,000回の反復計算を使って全体をリランしたところ Convert.ToDouble は、入力が悪いと8.3秒かかりました。平均すると、2時間以上かかることになります。いくら基本的なテストとはいえ、無効な入力の場合だと Convert.ToDouble の例外発生がパフォーマンスを台無しにします。

というわけで、ここでも TryParse 数字で裏付けながら。