[解決済み] Double.TryParseとConvert.ToDouble -どちらが速く、安全か?
質問
私のアプリケーションは、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
数字で裏付けながら。
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] AddTransient、AddScoped、AddSingleton サービスの相違点
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] .NETでは、'for'と'foreach'のどちらのループが速く実行されますか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。