C#我的while循环重复3次,然后提示进行其他选择

C#我的while循环重复3次,然后提示进行其他选择,c#,while-loop,C#,While Loop,我不熟悉C语言,但我对Java相当了解。我可能会错过一些简单的东西,我只是不知道,因为是新的这种特殊的语言。我正在尝试创建一个while循环,该循环会一直重复,直到用户选择Q为止。该循环可以很好地退出,但其中的代码会在停止之前重复3次,以提示用户进行选择。为什么会发生这种情况 class MainClass { public static void DisplayMenu() { Console.WriteLine("What would you like to do

我不熟悉C语言,但我对Java相当了解。我可能会错过一些简单的东西,我只是不知道,因为是新的这种特殊的语言。我正在尝试创建一个while循环,该循环会一直重复,直到用户选择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();
    }
}

原因可能是您正在使用
Console.Read()
,它将处理输入流中的下一个字符,其中包括用户按下
Enter
时的
\n
\r
字符。然后,在调用
Console.Read()
时,这些字符会立即在循环中处理

如果只需要一个字符,可以使用
Console.ReadKey()
,它返回用户键入的第一个键(类型为
ConsoleKeyInfo
)。然后可以对其
属性进行比较,如:

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

或者,如果您不想让他们按enter键,那么您应该使用
控制台.ReadLine()
方法,并检查它启动时使用了什么

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

原因可能是您正在使用
Console.Read()
,它将处理输入流中的下一个字符,其中包括用户按下
Enter
时的
\n
\r
字符。然后,在调用
Console.Read()
时,这些字符会立即在循环中处理

如果只需要一个字符,可以使用
Console.ReadKey()
,它返回用户键入的第一个键(类型为
ConsoleKeyInfo
)。然后可以对其
属性进行比较,如:

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

或者,如果您不想让他们按enter键,那么您应该使用
控制台.ReadLine()
方法,并检查它启动时使用了什么

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

从MSDN文档中:

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

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

另请参阅MSDN文档:

ReadLine方法或KeyAvailable属性和ReadKey方法优于使用Read方法


从MSDN文档中:

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

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

另请参阅MSDN文档:

ReadLine方法或KeyAvailable属性和ReadKey方法优于使用Read方法


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

静态void Main(字符串[]参数){


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

静态void Main(字符串[]参数){


可能是某个地方引发了未处理的异常。您可以添加try/catch块或附加调试器,并确保它捕获所有clr异常。如果您告诉他们按enter键,则应使用Console.ReadLine()。此外,由于您重新绘制了菜单,您可能希望在他们按enter键后清除屏幕。可能是某个地方引发了未处理的异常。您可以添加try/catch块或附加调试器,并确保它捕获所有clr异常。如果您告诉他们按enter键,则应使用Console.ReadLine()。另外,您可能希望在他们按enter键后清除屏幕,因为您重新绘制了菜单。我认为这句话不正确:“原因可能是您使用的是Console.Read(),它将返回整行…”Console.Read()的MSDN文档表示它返回输入流中的下一个字符。是的,它将一直阻止,直到用户点击Enter键,但每个调用只返回一个字符,而不是整行。您是对的,让我尝试更正。整行将成为输入流的一部分,但
Read()
只处理一个字符。我想是这样的。然后我需要将choice字符用于循环中的一个switch case中。使用readkey的do-while使它比应该的复杂得多。我也不确定我是否可以使用它。我让某人使用一个银行帐户,所以我需要让switch statement我不能根据输入的第一个字符来决定。如果s