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"));

Y/N or y/n in loop

while ((Console.ReadLine() == "Y") || (Console.ReadLine() == "y"));

这将读取2个不同的行,因为您调用了两次ReadLine()。您需要调用它一次并保存该值。

您可以使用ToUpper

while ((Console.ReadLine().ToUpper() == "Y") );

尝试使用String.EqualsStringComparison:

String.Equals(Console.ReadLine(), "y", StringComparison.CurrentCultureIgnoreCase);
从MSDN:

CurrentCultureIgnoreCase :使用区域性敏感排序规则、当前区域性和忽略正在比较的字符串的大小写来比较字符串。

OrdinalIgnoreCase :使用顺序排序规则比较字符串,忽略被比较字符串的大小写。

检查Yy忽略大小写,您应该使用string. equals (string,StringComparison)重载。

while (Console.ReadLine().Equals("Y", StringComparison.InvariantCultureIgnoreCase));

请参阅的土耳其İ问题和为什么你应该关心之前使用ToUpperToLower的字符串比较忽略大小写。

你当前的代码从控制台读取了两次行,这就是为什么你的代码在第二个值上卡住了。

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