Y/N or y/n in loop
本文关键字:in loop or | 更新日期: 2023-09-27 17:53:02
我在循环中执行Y/N或Y/N时有困难。我把它设计成这样,用户可以在循环中使用Y和N的大写和小写字母作为答案。顺便说一下,这是我的代码,但似乎不能使它工作:
do
{
Console.WriteLine("'nSelect additional topping/s'n");
Console.WriteLine("1 - Extra meat: 200");
Console.WriteLine("2 - Extra cheese: 100");
Console.WriteLine("3 - Extra veggies: 80'n");
int selectedTopping = Convert.ToInt32(Console.ReadLine());
switch (selectedTopping)
{
case 1:
pizza = new MeatToppings(pizza);
break;
case 2:
pizza = new CheeseToppings(pizza);
break;
case 3:
pizza = new VeggieToppings(pizza);
break;
default:
break;
}
Console.WriteLine("'nAdd more toppings? Y/N");
}
while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));
while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));
这将读取2个不同的行,因为您调用了两次ReadLine()
。您需要调用它一次并保存该值。
您可以使用ToUpper
while ((Console.ReadLine().ToUpper() == "Y") );
尝试使用String.Equals
和StringComparison
:
String.Equals(Console.ReadLine(), "y", StringComparison.CurrentCultureIgnoreCase);
从MSDN:
CurrentCultureIgnoreCase
:使用区域性敏感排序规则、当前区域性和忽略正在比较的字符串的大小写来比较字符串。
OrdinalIgnoreCase
:使用顺序排序规则比较字符串,忽略被比较字符串的大小写。
检查Y
或y
忽略大小写,您应该使用string. equals (string,StringComparison)重载。
while (Console.ReadLine().Equals("Y", StringComparison.InvariantCultureIgnoreCase));
请参阅的土耳其İ问题和为什么你应该关心之前使用ToUpper
或ToLower
的字符串比较忽略大小写。
你当前的代码从控制台读取了两次行,这就是为什么你的代码在第二个值上卡住了。
正如Austin刚才指出的,您在while循环语句中使用了两次ReadLine。
值得一提的是,尽量遵循模块化规则,这将有助于加快实现和调试我们的代码。
我已经有一段时间没有做任何c#编程了,所以用Java风格对它进行辅助编码。
由于它是命令行编程,您可能需要多次验证用户输入。我要做的一件事是创建一个实用程序类来包含常见的用户输入任务。
public class TerminalUtil {
private TerminalUtil() {}
public static boolean isYes(String msg){ return (msg.ToUpper() == "Y" || msg.ToUpper() == "YES"); }
public static boolean isNo(String msg){ return (msg.ToUpper() == "N" || msg.ToUpper() == "NO"); }
// You also might want basic conditionals to check if string is numeric or contains letters.
// I like using recursion for command line utilities so having a method that can re-print messages is handy
public static void display(String[] messages){
for(String msg : messages){
Console.WriteLine(msg);
}
}
public static boolean enterYesOrNo(String[] messages, String[] errorMessages){
display(messages)
String input = Console.ReadLine();
if( isYes(input) ){
return true;
} else if( isNo(input) ){
return false;
} else {
display(errorMessages); // Maybe something like, you didn't enter a yes or no value.
enterYesOrNo(messages, errorMessages); // Recursive loop to try again.
}
}
}
订购披萨的代码可能是这样的
public class OrderPizza{
public static int selectToppings(){
String[] message = new String[4];
message[0] = ("'nSelect additional topping/s'n");
message[1] = ("1 - Extra meat: 200");
message[2] = ("2 - Extra cheese: 100");
message[3] = ("3 - Extra veggies: 80'n");
int option = TerminalUtils.entryNumeric(message, {"You entered an non-numeric character, try again"} );
if( option > 0 && option <= 3 ){
return option;
} else {
Console.WriteLine("Number must be between 1 - 3, try again.");
return selectToppings();
}
}
public static Pizza order(){
Pizza pizza = new Pizza();
while(true){
int toppingCode = selectTopping();
pizza.addTopping(toppingCode);
if(!TerminalUtil.enterYesOrNo({"'nAdd more toppings? Y/N"}, {"Please enter a 'Y'es or 'N'o"}) ){
break;
}
}
}
}
这样做的主要好处是减少了while循环的业务逻辑,并且可以在TerminalUtils中重用代码。这也绝不是一个优雅的解决方案,我很懒,现在是凌晨3点,但它应该足以让球滚动。
你应该重新考虑的一件事是使用整数码来表示配料。使用enum可以使事情更容易实现。
我还注意到你添加了三种不同类型的披萨,我假设这是三个独立的对象。
由于要循环向pizza添加配料,所以要创建pizza的抽象类。通过这种方式,您可以将其扩展为一般的预构建披萨,如意大利辣香肠或奶酪,如果希望客户自定义订单,则可以使用抽象披萨类。
我没有找到更好的办法:
while ( str!="N" )
{
str = Console.ReadLine();
str = str.ToUpper();
if (str == "Y");
break;
};