不断要求用户在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;
}
按照@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();
}
}
一旦你适应了这种范式——在我看来,它会让代码更可读,阅读它的方式是:
- 吐出罐装反应
- 生成(行读取的)序列(第一个字符)
- 从该序列中获取,而char不是
- 对于顺序中的每个项目-吐出罐装响应(有条件的)
解释我的一些选择
- 我使用打印输出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——许多人对问号表示法表示不满——我喜欢在这个词小且视觉愉悦的地方使用
希望这能让你去你想去的地方。
玩得开心。