ダブル。TryParseます。ToDoubleがより速く、より安全な?
質問
アダプタのご使用をお読み込みのエクセルファイルを使用VSTOに追加し、読み込みデータを 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.34523"と"badinput"の両方の方法では、反復1,000,000ます。
有効な入力:
Double.TryParse = 646ms
Convert.ToDouble = 662 ms
ていないとして期待される。すべての意図や目的に、有効な入力は、これらは同じです。
無効の入力:
Double.TryParse = 612ms
Convert.ToDouble = ..
コース料理。を運営していた。I reran全体のことを1,000回と Convert.ToDouble
不入力した8.3秒です。平均化していくべきであるとして、2時間です。いう基本試験は、無効入力の場合、 Convert.ToDouble
'sの例外を上げま跡。
なので、いつものように投票 TryParse
一部の番号を返します。
他のヒント
ことから話を始めたいと思い思いの利用 double.Parse
よ Convert.ToDouble
最初の場所です。
かどうかを使用できる Parse
または TryParse
:できる場合が悪い入力データは本当に格別ですか?の場合は、利用 Parse
を及ぼす場合がありますので爆発する場合、入力は悪いものです。だが期待できれいに取り扱い、利用 TryParse
.
きます。NETフレームワークの設計ガイドラインでご使用になることをお勧めしてみます。回避の例外は、通常は良い方法がありました。
Convert.ToDouble(object)
まい ((IConvertible) object).ToDouble(null);
を通 Convert.ToDouble(string, null)
いので高速に文字列バージョン。
しかし、文字列バージョンでは:
if (value == null)
{
return 0.0;
}
return double.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, provider);
そのフォームコントロール間の相互いの double.Parse
ます。
場への取扱いは例外とTryParse.TryParseは速くないのでは全例外のスタックトレース.
私は概ねるべく避けるようにしましょう Convert
クラスの意味:をしていません)を見たいので非常に混乱:このコードを数が少なすぎるヒントに何が起こるこ Convert
で多くの意味的に非常に異なる変換が発生することを同じコードです。ことが困難であるという制御のためのプログラマで何が起こっています。
私の助言として取り扱われるため、決して明かさないことこのクラスです。なので本当に必要か(以外のバイナリフォーマットの数が通常の ToString
法数の授業において適切な方法でいます。
ない限り、100%一定の入力は、ほとんどの場合を使用してみてください。TryParse.
Convert.ToDouble will throw an exception on non-numbers
Double.Parse will throw an exception on non-numbers or null
Double.TryParse will return false or 0 on any of the above without generating an exception.
の速度解析と二次ときに例外をスローがあまりございませんので遅くなります。
多くの憎悪に変換クラスはこちら---ただ残高少が優位に変換しまれ、オブジェクト
Convert.ToDouble(o);
できるだけの値を返しであれば容易にo既にダブル(またはintまたは何も容易にキャスタブル).
を使用しまいます。を解析した。TryParseは持っている人は、手続きをすればい文字列が
Double.Parse(o.ToString());
は行 作 解析される文字列の最初とによっては入力できます。
ダブル。TryParseと思う。
で使いやすくするために、取り扱いを正確に把握にエラーが発生しました。
それに対処することができなかわい場合はfalseを返します(i.eが用できるのが最大の魅力です).
私が常に優先利用 TryParse()
方法では吐き出しに戻成功または失敗に変換さずに例外をスローしました。
個人的を見せていただいたのですが、 TryParse
方法は読みやすくなり、ついに実際に使いたいお客様の使用例:エラーがある場合扱うことができ現地で予定誤差とboolから TryParse
が良く、かいだけでは例外です。
私は期待し TryParse
に高速になりすぎられることを回避することができ、架空の例外です。ご利用のベンチマークツールのように、 Jon SkeetのMiniBench 比較の可能性が広がる。
これは興味深い古い問題です。私は追加の答えで誰も気づいたカップルのものの質問です。
より高速:ます。ToDoubleまたはDouble.TryParse?安全:ます。ToDoubleまたはDouble.TryParse?
私の回答の両方のこれらの質問で"あなたまその答えは後ほど、詳細は:
安全のためのもの 毎 プログラマを逃すことで、ライン(鉱):
に追加されているデータのみ数字桁数(1000 1000,2 1000,34- カンマで区切ったロシア規格に).
その後このコード例:
Convert.ToDouble(regionData, CultureInfo.CurrentCulture);
おもしろいでした場合には、スプレッドシートはロシアの数値フォーマットでエクセルは正しく入力は細胞の分野では、何が正しい解釈の値からExcel?
こちらはもう一つの興味深いことの二つの事例に関する速度:
catch (InvalidCastException)
{
// is not a number
}
このが発生MSILるようになります:
catch [mscorlib]System.InvalidCastException
{
IL_0023: stloc.0
IL_0024: nop
IL_0025: ldloc.0
IL_0026: nop
IL_002b: nop
IL_002c: nop
IL_002d: leave.s IL_002f
} // end handler
IL_002f: nop
IL_0030: return
この意味でしょ比較の総数MSILの指示を行う各プログラムがその後どの更新です。
私のコードが正しいものとみなし、明確にし、高速--- にくださっても結構です。