控制台.ReadKey正在处理退出前的最后一项

本文关键字:最后 一项 ReadKey 处理 退出 控制台 | 更新日期: 2023-09-27 18:16:10

我有一个很小的命令行实用程序,它读取用户输入并将所有输入添加到列表中。当按Esc键时,退出程序。然而,当按下Esc键时,甚至Escape键也被添加到列表中,然后程序退出。

如何防止Esc键被添加到列表中?

代码:

    ConsoleKeyInfo cki;
    List<string> stuffs = new List<string>();
    Console.WriteLine("Press Escape (Esc) to quit the program.");
    do {
        cki = Console.ReadKey();
        stuffs.Add(cki.Key.ToString());
        Console.WriteLine();
    } while(cki.Key != ConsoleKey.Escape);
    Console.WriteLine("You have entered the following data:");
    foreach(string stuff in stuffs)
        Console.WriteLine(stuff);

控制台.ReadKey正在处理退出前的最后一项

更改循环,以便在将其添加到列表之前检查值。例如,此循环相同,但在按下Escape时中断:

while(true)
{
    cki = Console.ReadKey();
    if (cki.Key == ConsoleKey.Escape)
       break;
    stuffs.Add(cki.Key.ToString());
    Console.WriteLine();
}

检查循环内的转义键,但在处理之前:

do {
    cki = Console.ReadKey();
    if (cki.Key == ConsoleKey.Escape) break;
    stuffs.Add(cki.Key.ToString());
    Console.WriteLine();
} while(true);

把你的do while循环放在它的头部,这样它就不会在检查条件之前进行处理:

Console.WriteLine("Press Escape (Esc) to quit the program.");
cki = Console.ReadKey();
while(cki.Key != ConsoleKey.Escape) {
    stuffs.Add(cki.Key.ToString());
    cki = Console.ReadKey();
    Console.WriteLine();
}

或者你可以像这样简化while…

while ((cki = Console.ReadKey()).Key != ConsoleKey.Escape)
{
    stuffs.Add(cki.Key.ToString());
    Console.WriteLine();
}