继续要求用户在c#中键入小写字母。当字母大写时给出错误

时间:2015-06-25 20:14:34

标签: c# loops

当用户输入"!"

时,程序结束

我不知道如何在循环中不断询问用户输入内容。

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;
}

2 个答案:

答案 0 :(得分:4)

正如@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,因为您可以自行处理错误。好吧,您可以使用Try ... Catch包围Parse,但异常很慢。

Parse v. TryParse

Why is throwing exceptions so slow?

所有信用都应该转到@Steve

答案 1 :(得分:3)

看起来你正在尝试学习一些基本的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. 依次为每个项目 - 吐出罐装回应(有条件的)
  5. 我的一些选择的解释

    • 我使用printout var来存储预设的响应。在更大的应用程序中,您宁愿使用资源来执行类似的操作。有时,固定的响应将是格式化的响应,这种范例在这种情况下仍然有用。阅读msdn。
    • 中的更多about resource management
    • 我写的SequenceOf util func。请注意,在C#中,返回IEnumerable的函数可以用两种方式之一实现 - 简单返回新的IEnumerable - 返回一个IEnumerable对象 - 是实现该函数的WYSIWYG方式。另一个更有趣的方式是iterator pattern这可以让你编写漂亮的代码,只在调用创建的IEnumerable的MoveNext函数时执行 - 并且它会产生&#39;一旦它能够创建你的下一个值或它到达序列的结尾 - 回到你的代码 - 非常整洁和非常有用的代码模式。 (编译器识别yield关键字并在实现IEnumerable接口的类中重新格式化代码。这已完成automagically然后编译器将自己的方法重写为&#34;返回new AutoGeneratedIEnumerableClass()&# 34;并保留调试行信息,以便稍后可以进行一个很好的调试会话)
    • 你会进一步注意到SequenceOf util函数是通用的 - 也就是说它可以用来创建一个char序列 - 或其他任何东西。你可以学习about generics in c# here
    • 更多SequenceOf接受Func委托参数。委托只是方法对象。它们是可以保存对单个方法的引用的特殊对象,然后被调用就像方法可以使用()表示法一样。在早期版本的C#和.net FW中,使用delegate关键字创建自己的委托对象非常有意义。但微软的目标是取悦 - 而在最新版本的FW中,你拥有适用于大多数现实世界需求的通用可重用委托对象。 learn more about delegates here
    • TakeWhile是LINQ的一部分,对LINQ没有足够的赞美。我尽可能地使用它。它使代码非常易读。
    • 当我使用SequenceOf时在Main函数中注意我没有通过简单的函数(尽管我可以) - 而是使用c#的简写来编写函数 - lambda表达式 - 尽管它们只是syntactic sugar,使你能够在将简单函数(简单行为)传递给其他函数时编写更清晰的代码 - 顺便说一下 - 当函数将另一个函数作为参数传递时 - 它被称为a higher order function
    • 最后但并非最不重要的是ternary if - 许多人对问号符号不屑一顾 - 我喜欢在术语较小且视觉上令人愉悦的地方使用。

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

    玩得开心。