أفضل طريقة للتحقق من إدخال خط القراءة في C#؟

StackOverflow https://stackoverflow.com/questions/503383

  •  20-08-2019
  •  | 
  •  

سؤال

اه شيئين:1) إنه تطبيق وحدة التحكم.2) أعرف أنه باللغة الدنماركية، ولكن لا يهم حقًا، إنه مجرد مثال لطلب بعض المدخلات.النص والمتغيرات لا يهم.

حسنًا، فكر في هذا الإدخال البسيط:يمكن أن يكون أي نوع من أسئلة الإدخال حقًا.

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);

الآن، ماذا لو كتب العميل شيئًا خاطئًا؟مثل الرسالة.ستضمن عملية المحاولة والالتقاط عدم تعطل التطبيق، ولكن هذا ليس هو الحل الذي أريده.أريد أن أقول أنك فعلت ذلك بشكل خاطئ، حاول مرة أخرى.كلاسيكية جميلة أليس كذلك؟

ولكن ما هي أفضل طريقة لحل هذا الحل؟لقد فكرت في هذا:

bool fangetKundenummer = true;
while (fangetKundenummer)
{
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
try
{
    kundenummer = Convert.ToInt16(inputKnr);
    fangetKundenummer = false;
}
catch
{
    Console.WriteLine("Fejl. Prøv igen");
}
}

لكن لا يبدو أنها الطريقة الصحيحة للقيام بذلك.

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

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

static void verifyInput()
{
    try
    {
        Console.WriteLine("question");
        input = Console.ReadLine();
        kundenummer = Convert.ToInt16(input)
    }
    catch
    {
        Console.WriteLine("Wrong. Do it over");
        verifyInput(); //start the function all over
    }
}

ولكن سيتعين عليك كتابة دالة لكل سؤال إدخال، على الرغم من أنهم قد يطلبون نفس الشيء بالضبط!(بمعنى ربما يطلب الجميع عددًا صحيحًا؛ولكن بسؤال ومتغير مختلف).

لا يبدو هذا أفضل بكثير من الحل while() .

هل لدى أي شخص فكرة ذكية؟

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

المحلول

يستخدم Int16.TryParse وما يعادلها من أنواع رقمية أخرى.كل هذه العناصر تُرجع نتيجة منطقية للإشارة إلى نجاح أو فشل التحليل، وتأخذ out المعلمة التي تم تعيينها على نتيجة التحليل (أو 0 في حالة الفشل).في حالتك، قد ترغب في إنهاء المكالمة بطريقة للاستمرار في المطالبة:

static Int16 PromptForInt16(string prompt)
{
    while (true)
    {
        Console.Write(prompt);
        Int16 result;
        if (Int16.TryParse(Console.ReadLine(), out result))
        {
            return result;
        }
        Console.WriteLine("Sorry, invalid number entered. Try again.");
    }
}

نصائح أخرى

يمكنك استخدام نمط TryParse:

string s; // for "is not valid" message
short val; // final value
while(!short.TryParse(s=Console.ReadLine(), out val)) {
    Console.WriteLine(s + " is not valid...");
}

فقط لبعض التنوع، ماذا عن اختبار السلسلة نفسها، بدلاً من TryParse، الأمر الذي قد يتطلب مساحة تخزين إضافية، وربما طاقمًا غير ضروري؟

static void Main(string[] args)
{
    var isFalse = "t".IsInt();
    var isTrue = "123".IsInt();
    var isAlsoFalse = "123.1".IsInt();

}

static bool IsInt(this IEnumerable<char> s)
{
    return s.All(x => char.IsNumber(x));
}

إليك الرابط الذي قد يساعد:

http://msdn.microsoft.com/en-us/library/system.int16.tryparse.aspx

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