行动后锁定案件?这可能吗?

时间:2015-04-25 03:35:04

标签: c# language-agnostic switch-statement

假设我的代码是这样的:

switch ( value ) {

case 1 "Hello" // <--- whatever word is in here is a command to make the following happen:

name.systemtext("Good job!"); // display this in the console

case 2 "hi"
name.systemtext("A good job also!");

case 3 "bye"
name.systemtext("many great jobs were had");

我想阻止这些重复。

因此,如果有人在案例2中,我不希望用户在显示“好工作”操作后能够重复hellohi。相反,我想显示一条消息,表明输入已被输入,然后强制该人去左边唯一的情况,即3(“再见”)。

我试图尽可能清楚地表明这一点,所以我希望有人可以提供帮助。我猜有人会告诉我,为了达到这个目的,我需要使用switch以外的东西吗?我很好,但我很好奇这是否可能。

2 个答案:

答案 0 :(得分:1)

这个怎么样:

private List<string> _possibleCases = new List<string>{"Hello", "Hi", ...};
...

var valueToCheck = "Hi";
var foundCase = this._possibleCases.FirstOrDefault(x => x == valueToCheck);

if (foundCase != null) this._possibleCases.Remove(foundCase);

switch (foundCase)
{
    case "Hello":
        // ...
        break;
    case "Hi":
        // ...
        break;
    ...
    default:
        // ...
        break;
}

答案 1 :(得分:0)

以下是使用状态机的示例。

您不需要开关,机器方法允许您更改机器的内部逻辑,而与机器匹配的输入循环不需要更改。

首先,我将仅显示与机器匹配的输入循环,以显示它看起来多么简单。在那之后,我将展示整个程序,这使得它看起来更复杂,但请记住,使用机器使得机器的消费者非常简单。

var machine = new StateMachine();

while (!machine.IsFinished())
{
    Console.WriteLine("Input a number from 1 to 3, but don't repeat a number you've input previously");
    var input = Console.ReadKey();
    Console.WriteLine();

    if (validInput.Contains(input.KeyChar)) {

        var newState = machine.TryTransition(input.KeyChar.ToString());

        if (newState == machine.Forbidden) {
            Console.WriteLine("You've input that before, try again!");
        } else {
            Console.WriteLine(newState.StateOutput);
        }

        Console.WriteLine("");
    }
}

以下是整个程序,包括机器的详细信息。在这种情况下,我选择使用{&#34;共享&#34;每个州实施一个跟踪时间是否曾经访问过一个国家的想法。

另一种方法,如果你的逻辑不想只允许状态一次,那么实际上是将允许的状态移动到每个单独的状态,其中每个单独的状态可能只允许转换到某些其他状态,但不是所有状态。 (常见的状态机案例)。

在这种情况下,似乎跟踪剩余的允许状态,在每个州可访问的静态中使事情变得简单。你当然可以摆脱静态(静态有问题)并将跟踪剩余允许状态的概念转移到static类本身。

StateMachine