循环中的Y / N或y / n

时间:2013-01-15 06:54:08

标签: c# .net if-statement string-comparison toupper

嗨,你们在循环中实现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"));

6 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

您可以使用ToUpper

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

答案 2 :(得分:6)

尝试使用String.EqualsStringComparison

String.Equals(Console.ReadLine(), "y", StringComparison.CurrentCultureIgnoreCase);
来自MSDN的

  

CurrentCultureIgnoreCase :使用对文化敏感的排序规则,当前文化和忽略要比较的字符串的大小写来比较字符串。

     

OrdinalIgnoreCase :使用序数排序规则比较字符串并忽略要比较的字符串的大小写。

答案 3 :(得分:5)

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

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

在使用ToUpperToLower进行字符串比较与忽略大小写之前,请参阅 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;
};