嗨,你们在循环中实现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"));
答案 0 :(得分:6)
while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));
这将会读取2个不同的行,因为您正在调用ReadLine()
两次。您需要调用一次并保存该值。
答案 1 :(得分:6)
您可以使用ToUpper
while ((Console.ReadLine().ToUpper() == "Y") );
答案 2 :(得分:6)
尝试使用String.Equals
和StringComparison
:
String.Equals(Console.ReadLine(), "y", StringComparison.CurrentCultureIgnoreCase);
来自MSDN的:
CurrentCultureIgnoreCase
:使用对文化敏感的排序规则,当前文化和忽略要比较的字符串的大小写来比较字符串。
OrdinalIgnoreCase
:使用序数排序规则比较字符串并忽略要比较的字符串的大小写。
答案 3 :(得分:5)
要检查Y
或y
忽略大小写,您应该使用string.Equals(string,StringComparison)重载。
while (Console.ReadLine().Equals("Y", StringComparison.InvariantCultureIgnoreCase));
在使用ToUpper
或ToLower
进行字符串比较与忽略大小写之前,请参阅 The Turkish İ Problem and Why You Should Care。
您当前的代码正在从控制台读取两行,这就是您的代码为第二个值而保留的原因。
答案 4 :(得分:1)
正如Austin所指出的那样,你在while循环语句中使用了两次ReadLine。
值得一提的是尝试遵循模块化规则,这将有助于加快实现和调试代码。
我做了任何C#编程已经有一段时间了,所以用Java风格对它进行sudo编码。
由于这是一个命令行编程,您可能不得不多次验证用户输入。我要做的一件事是让实用程序类包含常见的用户输入任务。
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点的IRL,但这应该足以让球滚动。
您应该重新考虑的一件事是使用整数代码来表示浇头。使用枚举可能会使事情更容易实现。
我还注意到你添加了三种不同类型的披萨,我假设它们是三个独立的对象。
由于您要循环添加披萨的配料,因此请制作一个抽象的披萨类。这样你可以扩展它的通用预制比萨饼,如意大利辣香肠或奶酪,如果你想让顾客定制他们的订单,可以使用抽象披萨类。
答案 5 :(得分:0)
我找不到更好的方法:
while ( str!="N" )
{
str = Console.ReadLine();
str = str.ToUpper();
if (str == "Y");
break;
};