Yes/No 使用字符的菜单无法正常工作

Yes/No Menu Using Characters Doesn't Work Correctly

我正在尝试制作一个简单的菜单,您可以在其中 select 选择一个或另一个来继续。此菜单使用 "read" 或 "write" 作为两个选项,而不是 "yes" 或 "no",但概念当然是相同的。代码看起来像这样...

public void Start()
    {
        char selection;
        do
        {
            Console.WriteLine("Would you like to read (r) or write (w) to a file?");
            selection = (char) Console.Read();
        } while (selection != 'r' || selection != 'w');
    }

现在,当您输入 'r' 或 'w' 时,这不仅不会停止循环,而且会在您之后随时按回车键后输入 3 行 WriteLine 文本。

任何人都可以阐明如何解决这个问题吗?我假设我不正确地使用了 Read() 方法,但作为新手,我发现很难通过一些事情简单地反复试验。任何帮助都将是惊人的。提前谢谢你。

编辑

public void Start()
    {
        char selection = 'y';
        while(selection == 'y')
        {
            Console.Write("Would you like to continue...");
            selection = (char)Console.Read();
            Flush();
        }
    }

public void Flush()
    {
        while(Console.In.Peek() != -1)
        {
            Console.In.Read();
        }
    }

Console.Read() 会给你输入的字符。一旦他们输入 'r' 就会停止。那不是你想要的吗? 按 ENTER 实际上会生成 2 个字符,因此它会再打印 2 次提示。 也许你只是想要这个:

public void Start()
{
    char selection;
    Console.WriteLine("Would you like to read (r) or write (w) to a file?");
    do
    {
        selection = (char) Console.Read();
    } while (selection != 'r' && selection != 'w');
}

selection != 'r' || selection != 'w' 始终为真。如果 selectionr,则 selection != 'w' 部分为真,如果 selection 不是 r,则 selection != 'r' 部分为真,所以你要么 false || true (这是真的),要么 true || ... (后一个操作数无关紧要)这也是真的。

你可能想要 while (selection != 'r' && selection != 'w').

解决您的问题的另一种方法是使用 break 调用中断循环,然后 return 插入的值。 示例:

class Program
{
    static void Main(string[] args)
    {
        char selection = read_or_write();
        Console.WriteLine("char in main function: "+selection);
        Console.WriteLine("press enter to close");
        Console.ReadLine(); //clean with enter keyboard
    }
    public static char read_or_write()
    {
        char selection;
        Console.WriteLine("Would you like to read (r) or write (w) to a file?");
        do
        {
            selection = (char)Console.Read();
            Console.ReadLine();//clean with enter keyboard
            if (selection == 'r')
            {
                Console.WriteLine("You pressed r");
                break;
            }
            else if (selection == 'w')
            {
                Console.WriteLine("You pressed w");
                break;
            }
            else
            {
                Console.WriteLine("You pressed a wrong key!");
            }
        } while (selection != 'r' || selection != 'w');
        return selection;
    }
}