سؤال

لقد القيم المخزنة في السلاسل DataTable حيث كل قيمة حقا يمكن أن تمثل int, double, أو string (كانوا جميعا تحويلها إلى سلاسل أثناء عملية الاستيراد من مصدر بيانات خارجي).أحتاج إلى اختبار ومعرفة ما هو نوع كل قيمة حقا.

ما هو أكثر كفاءة تطبيق (أو لا يوجد فرق عملي)?

  1. في محاولة لتحويل int (ثم double).إذا كان التحويل يعمل, عودة true.إذا تم طرح استثناء, عودة false.
  2. التعبيرات العادية مصممة لتتناسب مع نمط من int أو double
  3. طريقة أخرى?
هل كانت مفيدة؟

المحلول

استخدام مزدوج.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 framework 3.5 الهند تحولت على o is int تحقق يأخذ نفس الوقت try-catch عندما o في الواقع هو الباحث. o is int إلا قليلا أبطأ إذا كان س هو في الواقع شيء آخر.

مزعج التقدم سوف يلقي تحذيرات إذا كنت تفعل شيئا مثل:

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

ولكن أعتقد أن هذا الخلل في التقدم - أنه لا يعرف الباحث هو نوع القيمة وتوصي لك استخدام o as int بدلا من ذلك.

إذا المدخلات الخاصة بك هو دائما سلسلة int.TryParse هو الأفضل, وإلا is المشغل هو الأسرع.

كما لديك سلسلة أود أن ننظر في ما إذا كنت بحاجة إلى معرفة أنه int, بدلا من مزدوجة.إذا int.TryParse حتى ذلك الحين سوف يمر double.TryParse لذلك يمكن أن نصف عدد الشيكات العودة إما ضعف أو سلسلة الطابق الزوجي عندما تتوقع int.

المشكلة لديك هو أنه قد تكون هناك حالات حيث يمكن أن تكون الإجابة على جميع الأنواع الثلاثة.

3 يمكن الباحث ، عدد مزدوج أو سلسلة!

ذلك يعتمد على ما كنت تحاول القيام به و كم هو مهم أن يتم نوع معين.قد يكون من الأفضل تركها كما هي طالما يمكنك ، أو حتى بعض مع طريقة وضع علامة على كل واحد (إذا كان لديك عنصر تحكم مصدر من سلسلة الأصلي).

كنت شخصيا استخدم الباحث.tryparse ، ثم انقر نقرا مزدوجا.tryparse.الأداء على تلك الأساليب هو سريع جدا.كلاهما عودة منطقية.إذا كان كل تفشل ثم لديك سلسلة ، في كيفية تعريف البيانات الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top