C#我的while循环在提示另一个选择之前重复3次

时间:2017-10-20 18:18:23

标签: c# while-loop

我是C#的新手,但我非常了解Java。我可能会遗漏一些简单的东西,因为我不熟悉这种特殊的语言。我试图创建一个重复循环,直到用户选择Q.循环退出正常,但内部代码重复3次,然后停止提示用户选择。为什么会这样?

class MainClass
{


    public static void DisplayMenu() {
        Console.WriteLine("What would you like to do?");
        Console.WriteLine("(D)eposit");
        Console.WriteLine("(W)ithdraw");
        Console.WriteLine("(C)alculateInterest");
        Console.WriteLine("(S)howBalance");
        Console.WriteLine("(Q)uit");
        Console.WriteLine("************************************");
        Console.WriteLine("Make choice by entering first letter of choice,");
        Console.WriteLine("then press ENTER key:");
    }
    static void Main(string[] args) {

        Account account = new Account();
        char choice;
        double amount = 0.0;

        Console.WriteLine("************************************");
        Console.WriteLine("Welcome to Bernard's Bodacious Bank!");
        Console.WriteLine("************************************");
        Console.WriteLine("We have opened your account");
        DisplayMenu();
        choice = Char.ToUpper((char)Console.Read());

        while (!choice.Equals('Q')) {

            DisplayMenu();
            choice = Char.ToUpper((char)Console.Read()); 

        }

        account.ShowTransactions();
        Console.ReadKey();
    }
}

3 个答案:

答案 0 :(得分:1)

原因很可能是因为您正在使用Console.Read(),它将处理输入流中的下一个字符,其中包括用户按下时\n\r个字符EnterConsole.Read()字符1}}。然后,在调用Console.ReadKey()

时,会立即在循环内处理这些字符

如果您只想要一个字符,则可以使用ConsoleKeyInfo,它返回用户键入的第一个键(类型为Key)。然后,您可以对其Console.WriteLine("************************************"); Console.WriteLine("Welcome to Bernard's Bodacious Bank!"); Console.WriteLine("************************************"); Console.WriteLine("We have opened your account"); double amount = 0.0; ConsoleKeyInfo choice; do { DisplayMenu(); choice = Console.ReadKey(); } while (choice.Key != ConsoleKey.Q); 属性进行比较,例如:

Console.ReadLine()

或者,如果您 DO 希望允许他们按Enter键,那么您应该使用StartsWith方法并检查它DisplayMenu(); string choice = Console.ReadLine(); while (!choice.StartsWith("Q", StringComparison.OrdinalIgnoreCase)) { DisplayMenu(); choice = Console.ReadLine(); }

var quit = false;

while(!quit)
{
    DisplayMenu();

    var choice = Console.ReadKey();

    switch (choice.Key)
    {
        case ConsoleKey.D:
            Deposit();
            break;
        case ConsoleKey.W:
            Withdrawl();
            break;
        case ConsoleKey.C:
            CalcInterest();
            break;
        case ConsoleKey.S:
            ShowBalance();
            break;
        case ConsoleKey.Q:
            quit = true;
            break;
        default:
            Console.WriteLine("Invalid entry, try again");
            break;
    }
}

以下是您可以如何处理输入的示例。它假设您有可以为每个选择调用的方法:

docker run -d --restart on-failure -v hatchery:/var/lib/mysql \
           -e MYSQL_ROOT_PASSWORD=Kerrigan \
           -e MYSQL_DATABASE=zerglings --name spawning-pool mysql

答案 1 :(得分:1)

来自MSDN文档:

  

当您键入输入字符时,Read方法会阻止其返回;按Enter键时它会终止。按Enter键会将与平台相关的行终止序列附加到输入中(例如,Windows附加回车换行符序列)。对Read方法的后续调用一次检索输入的一个字符。检索完最后一个字符后,Read会再次阻止其返回并重复循环。

在Windows中,“平台相关的行终止序列”等于\r\n。因此,当您键入A,然后输入时,您实际上是要为您的程序发送3次击键。

同样来自MSDN文档:

  

ReadLine方法,或KeyAvailable属性和ReadKey方法比使用Read方法更可取。

答案 2 :(得分:0)

这似乎是最简单的答案,使用read key方法然后使用choice.Key和ConsoleKey.Q。谢谢你的帮助!它指出了我正确的方向!

static void Main(string [] args){

        Account account = new Account();
        double amount = 0.0;
        ConsoleKeyInfo choice;

        Console.WriteLine("************************************");
        Console.WriteLine("Welcome to Bernard's Bodacious Bank!");
        Console.WriteLine("************************************");
        Console.WriteLine("We have opened your account");
        DisplayMenu();
        choice = Console.ReadKey();
        while (choice.Key != ConsoleKey.Q) {
            switch (choice.Key) {
                case ConsoleKey.D:
                    Console.WriteLine("found d!");
                    break;
                default:
                    Console.WriteLine("Input Error!");
                    break;
            }
        }

        account.ShowTransactions();
        Console.ReadKey();
    }