【问题标题】:C# Having trouble with TryParseC# 遇到 TryParse 问题
【发布时间】:2019-02-26 23:27:09
【问题描述】:

我如何将TryParse 添加到此代码中,所以如果用户输入一个字母,它会告诉他,“无效,请仅输入数字”。我尝试了几种方法,但它破坏了我的代码。我已经用forwhile 循环尝试过。但是,当我确实让它工作时,它只需要 1 个数字,然后将该数字分配给我所有的数组。

{
    const int SIZE = 2;

    double[] array = new double[SIZE];
    Console.WriteLine("Please Sir Enter 2 numbers");
    for (int i = 0; i < SIZE; i++)
    {
         array[i] = Convert.ToDouble(Console.ReadLine());
    }
    Console.WriteLine("===============================================");
    Console.WriteLine("The Values you've entered are");
    Console.WriteLine("{0}{1,8}", "index", "value");
    for (int counter = 0; counter< SIZE; counter++)
    {
         Console.WriteLine("{0,5}{1,8}", counter, array[counter]);
    }
    Console.WriteLine("===============================================");            
    Console.ReadLine();
}

【问题讨论】:

  • 您能展示一下您尝试过但不起作用的方法之一吗?
  • while (!double.TryParse(Console.ReadLine(), out numbers)) {array[i] = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("请输入有效数字"); Console.WriteLine(""); }
  • @Doogie 请编辑问题以显示您尝试过的内容,以便代码格式正确且更易于阅读。

标签: c# tryparse


【解决方案1】:

在 for 循环中使用 while 循环,如下所示:

for (int i = 0; i < SIZE; i++)
{
   string input = Console.ReadLine();
   double num = 0;
   while(!Double.TryParse(input, out num))
   {
       Console.WriteLine("Not valid, please enter numbers only");
       input = Console.ReadLine();
   }
    array[i] = num;
}

【讨论】:

  • 这一行出现错误,array[i] = Double.Parse(val); CS1503 C# 参数 1:无法从“字符串”转换,另外我们还没有讨论 var,我们现在必须使用 int、double、decimal 和 string。我尝试对所有 var 使用 number 但没有用。
  • 不应该只是array[i] = val;之后吗? TryParse做了解析,值在val,不用再解析了。
  • 没有变量num。这怎么可能对你有用?
  • { string input = Console.ReadLine(); double num = 0; while (!Double.TryParse(input, out num)) { Console.WriteLine("Invalid Input try again."); input = Console.ReadLine(); } array[i] = (num); }
  • 如何在注释中添加代码以使其看起来正确?我搜索它说在代码前后添加反引号。
【解决方案2】:

为了从用户那里获得经过验证的输入(尤其是当类型不是字符串时),我发现使用辅助方法非常有用。

下面的方法接受一个显示给用户的字符串(输入提示),然后继续要求用户输入,直到他们输入一个有效的数字(TryParsewhile 条件的一部分)。

它还接受一个可选的函数参数,可用于验证输入,以防您想对其施加额外的限制。该函数定义为接收double(用户输入)并返回bool(如果输入有效,则返回true):

private static double GetDoubleFromUser(string prompt, Func<double, bool> validator = null)
{
    double result;

    do
    {
        Console.Write(prompt);
    } while (!double.TryParse(Console.ReadLine(), out result) ||
             (validator != null && !validator.Invoke(result)));

    return result;
}

要在您的代码中使用它,您只需执行以下操作:

Console.WriteLine($"Please sir, enter {SIZE} numbers");
for (int i = 0; i < SIZE; i++)
{
    array[i] = GetDoubleFromUser($" Enter number #{i + 1}: ");
}

输出


但有时您可能希望进一步限制数量,在这种情况下,您可以将验证方法传递给函数。一种简单的方法是将函数作为 lambda 表达式传递。例如这个表达式:i =&gt; i &gt; 10 表示“如果i 大于10,则返回比较结果”,或者换句话说,“如果i &gt; 10,则返回true,否则返回false”。

您可以像这样将它传递给我们的GetDoubleFromUser 方法:

double greaterThan10 = GetDoubleFromUser("Enter a number greater than 10: ", i => i > 10);

现在该方法将在输入不是数字或输入不大于 10 时继续循环!

输出

【讨论】:

  • 我不是在回答作业问题,只是展示了一种思考问题的方法。我认为最好给出一个不能只是复制粘贴并作为家庭作业上交的答案。 ?
  • 我看不出这些线程的哪一部分适用于这个答案......你能告诉我吗?
  • @Strom 我相信包含文本的图像指南适用于人们会复制和粘贴的文本,例如代码示例和异常消息。我很好奇为什么你想要这些输出结果的格式化文本?这有什么好处?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
相关资源
最近更新 更多