सबसे कारगर तरीका टेस्ट ऑब्जेक्ट प्रकार

वोट
17

मैं एक में तार के रूप में जमा मान हैं DataTableजहां प्रत्येक मूल्य वास्तव में एक का प्रतिनिधित्व कर सकता है int, doubleया string(वे सभी एक बाहरी डेटा स्रोत से एक आयात प्रक्रिया के दौरान तार में परिवर्तित किया गया)। मैं परखते हैं और देखते हैं कि किस प्रकार प्रत्येक मान वास्तव में है की जरूरत है।

क्या आवेदन के लिए और अधिक कुशल है (या कोई व्यावहारिक अंतर है)?

  1. कन्वर्ट करने के लिए प्रयास करें int(और फिर double)। यदि रूपांतरण काम करता है, वापसी true। एक अपवाद फेंका जाता है, तो वापसी false
  2. नियमित रूप से एक के आकार से मिलान करने के लिए डिज़ाइन भाव intयाdouble
  3. किसी अन्य विधि?
05/08/2008 को 08:49
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


5 जवाब

वोट
9

double.TryParse का प्रयोग करेंगे, यह प्रदर्शन फायदे हैं।

05/08/2008 को 08:54
का स्रोत उपयोगकर्ता

वोट
6

मैं कहना है कि इस तरह के सूक्ष्म प्रदर्शन के बारे में इतनी चिंता नहीं करते हैं। यह सिर्फ काम करने के लिए कुछ मिलता है, और फिर इसे के रूप में स्पष्ट और संक्षिप्त और आसान के रूप में संभव पढ़ने के लिए बनाने के लिए बेहतर है। सबसे बुरी बात आप कर सकते हैं प्रदर्शन का एक तुच्छ राशि के लिए बलिदान पठनीयता है।

अंत में, प्रदर्शन के मुद्दों से निपटने के लिए सबसे अच्छा तरीका उन्हें आप डेटा है कि इंगित करता है कि एक वास्तविक प्रदर्शन समस्या है जब के लिए बचाने के लिए है ... अन्यथा आप समय सूक्ष्म अनुकूलन का एक बहुत खर्च करते हैं और वास्तव में के लिए उच्च रखरखाव के खर्च का कारण बाद में।

यदि आप पाते हैं यह पार्स स्थिति वास्तव में अपने आवेदन में अड़चन है, तो समय कोशिश करते हैं और यह पता लगाने को हल करने का सबसे तेज़ तरीका कि समस्या क्या है के लिए है। मुझे लगता है कि जेफ (और कई अन्य) बात की इस तरह एक बहुत के बारे में ब्लॉग किया है।

05/08/2008 को 09:04
का स्रोत उपयोगकर्ता

वोट
5

मुसीबत तुम हो कि स्थितियों में, जहां इस सवाल का जवाब सभी तीन प्रकार के हो सकता है हो सकता है है।

3 एक पूर्णांक, एक डबल या एक स्ट्रिंग हो सकता है!

यह तुम क्या करने की कोशिश कर रहा है और कितना महत्वपूर्ण है कि वे एक विशेष प्रकार के कर रहे हैं कर रहे हैं क्या पर निर्भर करता है। यह सबसे अच्छा बस (आप मूल स्ट्रिंग के स्रोत के नियंत्रण कर लिया हो) कुछ एक विधि से हर एक को चिह्नित करने के साथ उन्हें छोड़ने के लिए के रूप में वे जब तक आप या वैकल्पिक रूप से कर सकते हैं, के रूप में कर रहे हैं, हो सकता है।

23/09/2008 को 22:38
का स्रोत उपयोगकर्ता

वोट
5

आप चाहे आप पर अनुकूलन के साथ संकलन के आधार पर अलग अलग तरीकों के लिए अलग अलग परिणाम प्राप्त करेंगे। आप मूल रूप से कुछ ही विकल्प हैं:

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 गुना से प्रत्येक की कोशिश करता है और प्रत्येक के लिए अवधि रिटर्न (परीक्षण जब ओ एक पूर्णांक है और जब यह कुछ और ही है) स्थापित कर सकते हैं।

try-catchविधि तेज करता है, तो वस्तु किसी पूर्णांक पकड़ करता है सबसे धीमी है, और अब तक अगर ऐसा नहीं होता है (से भी धीमी GetType)। int.TryParseयदि आप एक स्ट्रिंग है सुंदर तेज है, लेकिन अगर आप एक अज्ञात वस्तु है यह धीमी है।

दिलचस्प बात यह है चालू नेट 3.5 और अनुकूलन के साथ o is intचेक के रूप में एक ही समय लगता है try-catchजब ओ वास्तव में एक पूर्णांक है। o is intअगर ओ वास्तव में कुछ और ही है केवल थोड़ा धीमी है।

Annoyingly FxCop चेतावनी ऊपर फेंक अगर आप की तरह कुछ करना होगा:

if( o is int )
    int j = (int) o;

लेकिन मुझे लगता है कि FxCop में एक बग है - यह पता नहीं है पूर्णांक एक मान प्रकार है और आप का उपयोग करने की सिफारिश o as intके बजाय।

अपने इनपुट हमेशा होता है, तो एक स्ट्रिंग int.TryParseसबसे अच्छा है, नहीं तो isऑपरेटर तेज है।

यदि आप एक स्ट्रिंग है जैसा कि मैंने पर आप को पता है कि यह एक पूर्णांक है, बल्कि एक दुगुने से भी जरूरत है कि क्या देखने के लिए चाहते हैं। तो int.TryParseगुजरता तो होगा double.TryParseताकि आप आधा जांच की संख्या सकता है - वापसी या तो डबल या स्ट्रिंग और फर्श युगल आप एक पूर्णांक की उम्मीद है।

10/08/2008 को 18:43
का स्रोत उपयोगकर्ता

वोट
3

मैं व्यक्तिगत रूप से int.tryparse, तो double.tryparse का उपयोग करेंगे। उन तरीकों पर प्रदर्शन काफी तेज है। वे दोनों एक बूलियन लौट आते हैं। यदि दोनों तो असफल आप एक स्ट्रिंग है, तो आप अपने डेटा प्रति कैसे परिभाषित किया।

05/08/2008 को 09:02
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more