最小化if / else if语句的数量

时间:2018-09-04 19:26:41

标签: c# if-statement

我目前正在大学的一个项目中编写语音工具。我得到了减少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语句

3 个答案:

答案 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