我目前正在大学的一个项目中编写语音工具。我得到了减少if / else if语句数量的建议,但我想不出解决它的另一种方法,除非使用switch / case。
每个语音输出都不同,并且协程根据火车类型需要不同的参数。所以我不知道如何简化这些。 C#中是否有特殊的方法/最佳实践来解决此类问题?
该应用程序是使用Microsoft Speech API在Unity中开发的
所以语句就像
if (spokenText.IndexOf("Ticket") > 0)
// Voice Output
else if (spokenText.IndexOf("Wo") > 0)
{
if (spokenText.IndexOf("Bahn") > 0 || spokenText.IndexOf("Zug") > 0)
{
//Ask for Train
}
else if (spokenText.IndexOf("nächste") > 0 && (spokenText.IndexOf("RE") > 0 || spokenText.IndexOf("S-Bahn") > 0 || spokenText.IndexOf("ICE") > 0) || spokenText.IndexOf(" S ") > 0
|| spokenText.IndexOf("IC") > 0 || spokenText.IndexOf("EC") > 0)
{
if (spokenText.IndexOf("ICE") > 0)
{
//Start Coroutine
}
else if (spokenText.IndexOf("EC") > 0)
{
// Start Coroutine with different Parameter
}
else if (spokenText.IndexOf("IC") > 0)
{
//Start Coroutine with different Parameter
}
}
else
// Voice output
}
else if (spokenText.IndexOf("Wann") > 0)
{
if ((spokenText.IndexOf("Zug") > 0 || spokenText.IndexOf("Bahn") > 0) && spokenText.IndexOf("nächste") > 0 && spokenText.IndexOf("nach") > 0)
{
// Coroutine
}
else if (spokenText.IndexOf("Zug") > 0 || spokenText.IndexOf("Bahn") > 0)
{
// Voice output
}
else if (spokenText.IndexOf("nächste") > 0 && (spokenText.IndexOf("RE") > 0 || spokenText.IndexOf("S-Bahn") > 0 || spokenText.IndexOf("ICE") > 0) || spokenText.IndexOf(" S ") > 0
|| spokenText.IndexOf("IC") > 0 || spokenText.IndexOf("EC") > 0)
{
if (spokenText.IndexOf("ICE") > 0)
{
// Coroutine
}
else if (spokenText.IndexOf("EC") > 0)
{
//Coroutine
}
else if (spokenText.IndexOf("IC") > 0)
{
//Coroutine
}
}
else
//Voice Output
}
else if (spokenText.IndexOf("Barrierefrei") > 0 || spokenText.IndexOf("Aufzug") > 0 || spokenText.IndexOf("Rolltreppe") > 0)
{
//Coroutine
}
else {
//Voice Output
}
}
编辑:首先添加if语句
答案 0 :(得分:0)
多次调用同一字符串的IndexOf效率不高。您可以将字符串拆分为标记,然后使用Dictionary<string, Action>
为每个标记调用一个方法,如下所示:
class Program
{
static void Main(string[] args)
{
var sc = new SomeClass();
sc.ProcessTokens("aa bb");
}
}
class SomeClass
{
private Dictionary<string, Action> actions = new Dictionary<string, Action>();
private int someContext = 0;
public SomeClass()
{
actions["aa"] = DoA;
actions["bb"] = DoB;
}
public void ProcessTokens(string tokens)
{
foreach (var token in tokens.Split(' '))
actions[token]();
}
private void DoA()
{
someContext++;
Console.Write("A" + someContext.ToString());
}
private void DoB()
{
someContext++;
Console.Write("B" + someContext.ToString());
}
因此,如果您有成百上千的方法被一个一个地调用,而不是数千个if-else-else-else-,那么在同一个类中可以跟踪上下文。
答案 1 :(得分:0)
您在一个类别中有太多无关的项目。将选项分成小组,如下面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
enum MODE
{
GERMAN,
TICKET,
WANN,
WO,
}
enum COROUTINE
{
ICE,
EC,
IC,
BARRIEREFREI,
AUFZUG,
ROLLTREPPE,
ZUG,
BAHN,
NÄCHSTE
}
static void Main(string[] args)
{
MODE mode = MODE.TICKET;
COROUTINE coroutine = COROUTINE.IC;
string language = "nächste";
switch (mode)
{
case MODE.GERMAN :
switch (language)
{
case "Barrierefrei" :
Coroutine(COROUTINE.BARRIEREFREI);
break;
case "Aufzug":
Coroutine(COROUTINE.AUFZUG);
break;
case "Rolltreppe":
Coroutine(COROUTINE.ROLLTREPPE);
break;
}
break;
case MODE.TICKET:
Voice();
break;
case MODE.WANN:
switch (language)
{
case "Zug":
Coroutine(COROUTINE.ZUG);
break;
case "Bahn":
Coroutine(COROUTINE.BAHN);
break;
case "NÄCHSTE":
Coroutine(COROUTINE.NÄCHSTE);
break;
default :
Voice();
break;
}
break;
case MODE.WO:
switch (coroutine)
{
case COROUTINE.EC :
Coroutine(COROUTINE.EC);
break;
case COROUTINE.ICE:
Coroutine(COROUTINE.ICE);
break;
case COROUTINE.IC :
Coroutine(COROUTINE.IC);
break;
default :
Train();
break;
}
break;
default :
Voice();
break;
}
}
static void Coroutine(COROUTINE parameter)
{
}
static void Voice()
{
}
static void Train()
{
}
}
}
答案 2 :(得分:0)
观察对。您的方法太长,因此容易出错。我遵循个人规则,拥有不需要滚动的方法。
第二,if / else语句的数量通常在Strategy pattern之后。
SpokenTextStrategy(或策略)可以像TicketStrategy,WoStrategy,WannStrategy。
此外,您可以将其封装为一种方法: 枚举SomeTextCheck {ICE,EC,IC};
homograpy-test.jpg