【问题标题】:Best way to verify readline input in C#?在 C# 中验证 readline 输入的最佳方法是什么?
【发布时间】:2009-02-02 14:31:17
【问题描述】:

哦,有两件事: 1) 它是一个控制台应用程序。 2)我知道它是丹麦语,但这并不重要,它只是要求输入的一个例子。文本和变量无关紧要。

好的,考虑这个简单的输入: 真的可以是任何类型的输入问题。

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

现在,如果客户输入错误怎么办?比如一封信。 try & catch 将确保应用程序不会中断,但这不是我想要的解决方案。 我想让它说你做错了,再试一次。 很经典吧?

但是解决此解决方案的最佳方法是什么?我想到了这个:

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 个输入问题。这意味着这个讨厌的 while() 循环的 4 倍。

你也可以写一个函数。这样的事情(没有理由以正确的方式做,只是为了说明一个概念):

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() 解决方案好多少。

有人有聪明的主意吗?

【问题讨论】:

    标签: c# readline verify


    【解决方案1】:

    使用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.");
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 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...");
      }
      

      【讨论】:

      • 在输入无效的情况下总是写“0无效”;)(据我所知,您需要一个临时字符串变量。)
      【解决方案3】:

      对于某些种类,如何测试字符串本身,而不是 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));
      }
      

      【讨论】:

      • 当然,这不会测试字符串的长度,但您可以轻松地为其添加计数。经过快速测试,它比 TryParse 略快 (5%)。
      【解决方案4】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多