我有存儲爲DataTable
串,其中每個值可以真正代表值的int
,double
,或string
(在導入過程中,他們都轉換爲字符串,從外部數據源)。我需要測試一下每個值的真實類型。最有效的方式來測試對象類型
什麼更有效的應用程序(或沒有實際的區別)?
- 嘗試轉換爲
int
(然後double
)。如果轉換工作,返回true
。如果拋出異常,則返回false
。 - 正則表達式專爲匹配
int
或double
的模式而設計 - 其他一些方法?
我有存儲爲DataTable
串,其中每個值可以真正代表值的int
,double
,或string
(在導入過程中,他們都轉換爲字符串,從外部數據源)。我需要測試一下每個值的真實類型。最有效的方式來測試對象類型
什麼更有效的應用程序(或沒有實際的區別)?
int
(然後double
)。如果轉換工作,返回true
。如果拋出異常,則返回false
。int
或double
的模式而設計會使用double.TryParse,它具有性能優勢。
我個人使用int.tryparse,然後double.tryparse。這些方法的性能非常快。他們都返回一個布爾值。如果兩者都失敗,那麼你有一個字符串,根據你如何定義你的數據。
我會說,別擔心這樣的微觀表現。讓某些東西起作用好得多,然後儘可能簡潔明瞭地閱讀。你能做的最糟糕的事情就是犧牲可讀性來減少微不足道的表現。
最後,處理性能問題的最好方法是將它們保存爲當數據表明存在實際的性能問題時......否則,您將花費大量的時間進行微優化,並且實際上導致以後的維護成本會更高。
如果您發現此解析情況實際上是您的應用程序的瓶頸,那麼現在是時候嘗試並找出解決問題的最快方法。我認爲傑夫(以及其他許多人)已經就這類事情進行了很多博客。
根據您是否使用優化進行編譯,您將得到不同方法的不同結果。基本上,你有幾種選擇:
object o;
//checking with is
o is int
//check type
o.GetType() != typeof(int)
//cast and catch exception
try{ int j = (int) o; }
catch {}
//use the tryparse
int.TryParse(Convert.ToString(o), out j)
您可以輕鬆地設置,嘗試這些10,000次和(當o是一個int時,它的別的測試)返回持續時間爲每一個控制檯應用程序。
try-catch
方法是最快的,如果對象確實保存一個int,並且到目前爲止最慢如果它不是最慢(甚至比GetType
慢)。如果你有一個字符串,int.TryParse
是相當快的,但如果你有一個未知的對象,它會變慢。
有趣的是,在.Net 3.5和優化開啓時,o is int
檢查與try-catch
的檢測時間相同,當o實際爲int時。如果o實際上是別的東西,o is int
只會稍微慢一些。
,如果你這樣做煩人的FxCop將引發了警告:
if(o is int)
int j = (int) o;
但我認爲這是在FxCop的錯誤 - 它不知道int是值類型,建議您使用o as int
代替。
如果您的輸入始終是字符串int.TryParse
是最好的,否則is
運算符是最快的。
由於你有一個字符串,我會看看你是否需要知道它是一個int,而不是double。如果int.TryParse
通過,那麼double.TryParse
也是如此,因此您可以將檢查數量減半 - 當您期望int時,返回double或string並返回double。
您遇到的問題是,可能會出現答案可能全是三種類型的情況。
3可能是一個int,一個雙精度或一個字符串!
這取決於你想要做什麼以及它們是一個特定類型的重要性。最好是儘可能長時間留下它們,或者用一種方法來標記每一個(如果你能控制原始字符串的來源)。
最終目標是嘗試確定對象的最獨特的數據類型。 3將是一個整數。 3.5將是雙倍的。 「三」將是一個字符串。我最終組合了一個函數,嘗試了一堆object.TryParse調用,直到它可以確定什麼是「最適合」數據類型。 – 2008-09-25 14:06:44