不断要求用户在c#中键入小写字母.当字母为大写时,给出一个错误

本文关键字:错误 一个 用户 不断要求 小写字 | 更新日期: 2023-09-27 17:59:51

当用户键入"!"时,程序结束

我不知道如何在循环中不断地向用户请求输入。

Console.WriteLine("Type a lowercase letter.");  
char letter = char.Parse(Console.ReadLine());
while(letter !='!')
{
    if(char.IsLower(letter))
    {
        Console.WriteLine("OK. Type another lowercase letter");
    }
    else
    {
        Console.WriteLine("Error");
    }
    letter = char.Parse(Console.ReadLine());
    break;
}

不断要求用户在c#中键入小写字母.当字母为大写时,给出一个错误

按照@Steve的建议,删除中断。当您处于循环中时,break语句会立即将您带出该循环。在您的情况下,您的while只循环了一次。

点击此处阅读更多信息:https://msdn.microsoft.com/en-us/library/adbctzc4.aspx

  Console.WriteLine("Type a lowercase letter.");
  char letter;
  Char.TryParse(Console.ReadLine(), out letter);
  while (letter != '!')
  {
    if (char.IsLower(letter))
    {
      Console.WriteLine("OK. Type another lowercase letter");
    }
    else
    {
      Console.WriteLine("Error");
    }
    Char.TryParse(Console.ReadLine(), out letter);
  }

Parse更改为TryParse,因为您可以自己处理错误。好吧,你可以试着把Parse包围起来。。。捕获但异常是缓慢的。

Parse诉TryParse

为什么抛出异常如此缓慢?

所有功劳都应该归于@Steve

看起来您正在尝试学习一些基本的C#技术。因此,另一个按照你说的做的例子——使用不同的范式:

    static void Main(string[] args)
    {
        var printout = new string[] { "Type a lowercase letter.", "OK. Type another lowercase letter", "Error" };
        Console.WriteLine(printout[0]);
        var sequance = SequenceOf(() => (Console.ReadLine() + " ")[0])
            .TakeWhile(x => x != '!');
        foreach (var item in sequance)
        {
            Console.WriteLine(printout[char.IsLower(item) ? 1 : 2]);
        }
    }
    public static IEnumerable<T> SequenceOf<T>(Func<T> generator)
    {
        while (true)
        {
            yield return generator();
        }
    }

一旦你适应了这种范式——在我看来,它会让代码更可读,阅读它的方式是:

  1. 吐出罐装反应
  2. 生成(行读取的)序列(第一个字符)
  3. 从该序列中获取,而char不是
  4. 对于顺序中的每个项目-吐出罐装响应(有条件的)

解释我的一些选择

  • 我使用打印输出var来存储固定的响应。在一个更大的应用程序中,你宁愿使用资源来做类似的事情。有时,固定的响应将是格式化的响应,这种模式在这种情况下仍然有用。阅读msdn中有关资源管理的更多信息
  • 我写的util函数的序列。请注意,在C#中,返回IEnumerable的函数可以用两种方式之一实现——简单的返回新IEnumerable-返回一个IEnumeraable对象——是实现该函数的所见即所得方式。另一种更有趣的方式是迭代器模式,它可以让你编写外观漂亮的代码,只在调用创建的IEnumerable的MoveNext函数时执行——一旦它能够创建下一个值或到达序列的末尾,它就会"屈服"回你的代码——非常整洁和有用的代码模式。(编译器识别yield关键字,并在实现IEnumerable接口的类中重新格式化代码。这是自动完成的。然后编译器将您自己的方法重写为"return new AutoGeneratedEnumerableClass()",并保留调试行信息,以便您以后可以进行良好的调试会话)
  • 您将进一步注意到SequenceOf util函数是通用的,也就是说,它可以用于创建char序列或其他任何序列。你可以在这里学习c中的泛型
  • SequenceOf接受Func委托参数的次数越多。委托只是方法对象。它们是特殊的对象,可以保存对单个方法的引用,然后可以像使用()表示法调用方法一样进行调用。在C#和.net FW的早期版本中,使用delegate关键字创建自己的委托对象非常有意义。但微软的目标是取悦——在最新版本的FW中,你有通用的可重复使用的委托对象,适合你的大多数现实需求。在此处了解有关代表的更多信息
  • TakeWhile是LINQ的一部分,对LINQ没有足够的赞扬。我能用的时候就用。它使得代码可读性很强
  • 请注意,在Main函数中,当我使用SequenceOf时,我不会传递简单的函数(尽管我可以),而是使用c#的简写来编写函数-lambda表达式-尽管它们只是语法糖,使您能够在将简单函数(简单行为)传递给其他函数时编写更清晰的代码——顺便说一句——当一个函数获得另一个函数作为参数时,它被称为高阶函数
  • 最后但并非最不重要的是三元if——许多人对问号表示法表示不满——我喜欢在这个词小且视觉愉悦的地方使用

希望这能让你去你想去的地方。

玩得开心。

相关文章: