سؤال

أقوم ببعض التسلسل المخصص ، ومن أجل توفير بعض المساحة ، أريد أن أقوم بتسلسل العشرية باعتبارها int ، إن أمكن من الحكمة. يعد الأداء مصدر قلق ، لأنني أتعامل مع عدد كبير من البيانات. الطريقة الحالية التي أستخدمها هي:

if ((value > Int32.MinValue) && (value < Int32.MaxValue) && ((valueAsInt = Decimal.ToInt32(value)) == value))
{
    return true;
}

هل يمكن تحسين هذا؟

هل كانت مفيدة؟

المحلول

هل لديك أي قيم سلبية؟ أظن نعم نظرًا لأن لديك فحص Minvalue ، وإلا يمكنك تخطيه. يمكنك حتى استخدام int غير موقعة والتي ستسمح لك بتحويل المزيد من القيم المزدوجة إلى ints.

يحرر: أيضًا ، إذا كان لديك أرقام أكثر إيجابية ، فيمكنك تبديل أول شرطين. وبهذه الطريقة ، فإن الأول هو الأكثر احتمالًا للفشل ، مما يقلل من إجمالي عدد المقارنات.

نصائح أخرى

معايير الإبطال الخاصة بك هي:

1) هل هو أكبر من maxvalue؟

2) هل هو أصغر من minvalue؟

3) هل يحتوي على مكون كسري؟

يبدو أنك قد غطت لهم. سيكون تنفيذي:

public bool IsConvertibleToInt(decimal value)
{
    if(value > int.MaxValue)
       return false;

    if(value < int.MinValue)
       return false;

    if(Math.Floor(value) < value && Math.Ceiling(value) > value)
       return false;

    return true;
}

وماذا عن هذا. أعتقد أن الأمر يجب أن يستغرق عمليات أقل (على الأقل عدد أقل من المقارنات):

    return (value == (Int32)value);

تذكر أيضًا ، إذا كان if البيان ببساطة يعيد منطقية ، يمكنك فقط إعادة المقارنة. قد يجعل ذلك وحده أسرع (ما لم يحسن المترجم بالفعل لهذا الغرض). إذا كان عليك استخدام العبارة if ، فيمكنك القيام بذلك بالمثل:

    if (value == (Int32)value)
    {
        //Do stuff...
    return true;
    }
    else
    {
        //Do stuff...
        return false;
    }

تعديل: أدرك أن هذا لا يعمل بالفعل. كنت أفكر في أن الممثلين INT32 سوف ينسخ فقط في أول 32 بت من العشرية ، تاركًا وراء أي أجزاء متبقية (وليس رمي استثناء) ، لكن للأسف ، لم ينجح الأمر بهذه الطريقة (ناهيك عن أنه سيكون من الخطأ جميع القيم السلبية).

يعتمد ذلك على عدد الأماكن العشرية التي لديك أو تهتم بها حقًا. إذا كان بإمكانك القول أنني أهتم فقط بما يصل إلى 3 أماكن عشرية ، فإن أكبر رقم يمكنك تخزينه في int32 هو int.maxvalue / 1000. إذا كنت تعمل فقط بأرقام إيجابية ، فيمكنك الحصول على رقم أعلى باستخدام UINT. في أي حال ، فإن الطريقة للقيام بذلك هي حجز مساحة ثابتة للعشرية واستخدام * 1000 لتشفيرها و / 1000 لفك تشفيرها من / من العشرية.

لا حاجة إلى "valueasint =". أعتقد أن (decimal.toint32 (القيمة) == قيمة)) يحصل على نفس النتيجة مع مهمة واحدة أقل. هل تستخدم valueasint كنوع من معلمة الإخراج؟

ألا تتمكن من فعل شيء مثل:

if(Decimal.ToInt32(value) == value)
{
     return true;
}

ليس خبيرًا في .NET ، لكنني أعتقد أن هذا يجب أن يكون كل ما يتطلبه الأمر. أيضًا ، يجب أن يكون مشغلو المقارنات "أو متساوون" لأن قيم MIN/MAX صالحة أيضًا.

تحرير: كما هو موضح في التعليق ، هذا من شأنه أن يلقي استثناء. يمكنك محاولة التقاط الاستثناء والعودة الخاطئة ، ولكن في هذه المرحلة ، من المحتمل أن يكون ذلك أسرع بكثير لإجراء اختبار MIN/MAX بنفسك.

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