我是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();
}
}
答案 0 :(得分:1)
原因很可能是因为您正在使用Console.Read()
,它将处理输入流中的下一个字符,其中包括用户按下时\n
和\r
个字符Enter
和Console.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();
}