C#如何使开关忽略无效输入?

时间:2012-10-22 17:56:51

标签: c#

我正在尝试制作一个以标题屏幕开头的简单控制台游戏。用户输入“N”表示新游戏,“L”表示加载游戏,“E”表示退出。我将此设置为开关,但我需要知道如何使程序忽略除上述键之外的任何输入。我用Google搜索了这个问题,但未找到答案。如果可以,请帮忙。

我没有看到发布代码的重点,因为10行简单的开关可能不会对解决问题非常有帮助。此外,如果有一种比开关更容易/更有效的方式,我很想知道。

感谢。

5 个答案:

答案 0 :(得分:3)

您可以使用default: statement来处理其他(未知)案例:

switch(inputString.ToLower())
{
     case "n":
       // Handle new
       break;
     //.. handle known cases
     default:
         Console.WriteLine("Unknown option chosen.  Please enter valid option:");
         // Re-read values, etc?
         break;
}

在您的其他一个案例中未指定的任何内容都将属于default案例,然后您可以使用该案例来提示有效输入。

答案 1 :(得分:1)

如果您想要忽略除有效键之外的所有键,您可以执行以下操作:

public static char ReadKey(IEnumerable<char> validKeys)
{
    var validKeySet = new HashSet<char>(validKeys);
    while (true)
    {
        var key = Console.ReadKey(true);
        if (validKeySet.Contains(key.KeyChar))
        {
            //you could print it out if you wanted.
            //Console.Write(key.KeyChar);
            return key.KeyChar;
        }
        else
        {
            //you could print an error message here if you wanted.
        }
    }
}

当您使用ReadKey(true)时,true表示它将拦截该密钥而不会在控制台上显示该密钥。这使您可以选择确定它是有效还是无效。

答案 2 :(得分:0)

如果switch语句没有default块,并且正在打开的表达式与任何case块都不匹配,则switch语句会什么都没有。

答案 3 :(得分:0)

当你只有3个案例时,一个开关并不比一个简单的if-else构造更有效。

if (input == "N")
{
    // New game
}
else if (input == "L")
{
    // Load game
}
else if (input == "E")
{
    // Exit game
}
// if none of the cases match, the input is effectively ignored.

如果您坚持使用开关,那么您的构造非常相似:

switch (input)
{
    case "N":
        //New Game
        break;
    case "L":
        //Load Game
        break;
    case "E":
        //Exit Game
        break;
    default:
        //Do nothing (ignore unmatched inputs)
        break;
}

答案 4 :(得分:0)

感谢回复,伙计们。我设法通过执行以下操作来解决问题:

static void titleInput()
    {
        ConsoleKeyInfo titleOption = Console.ReadKey(true);

        switch (titleOption.Key)
        {
            case ConsoleKey.N:
                Console.Clear();
                break;
            case ConsoleKey.L:
                break;
            case ConsoleKey.E:
                Environment.Exit(0);
                break;
            default:
                titleInput();
                break;

        }
    }

我不确定这是多么“恰当”,但它确实做到了我需要做的事情。除“N”,“L”和“E”以外的任何键都不再执行任何操作。