假设我的代码是这样的:
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中,我不希望用户在显示“好工作”操作后能够重复hello
或hi
。相反,我想显示一条消息,表明输入已被输入,然后强制该人去左边唯一的情况,即3(“再见”)。
我试图尽可能清楚地表明这一点,所以我希望有人可以提供帮助。我猜有人会告诉我,为了达到这个目的,我需要使用switch
以外的东西吗?我很好,但我很好奇这是否可能。
答案 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