是否可以优化字符串上的大型开关?

Cor*_*urn 4 c# optimization

我正在浏览我的图书馆的一位朋友,因为他询问了优化问题,我遇到了一段代码,如下所示:

long digit = 0;

switch (word) {
    case "zero":
        digit = 0;
        break;
    case "a":
    case "one":
        digit = 1;
        break;
    case "two":
        digit = 2;
        break;
    case "three":
        digit = 3;
        break;
    case "four":
        digit = 4;
        break;
    case "five":
        digit = 5;
        break;
    case "six":
        digit = 6;
        break;
    case "seven":
        digit = 7;
        break;
    case "eight":
        digit = 8;
        break;
    case "nine":
        digit = 9;
        break;
    case "ten":
        digit = 10;
        break;
    case "eleven":
        digit = 11;
        break;
    case "twelve":
        digit = 12;
        break;
    case "thirteen":
        digit = 13;
        break;
    case "fourteen":
        digit = 14;
        break;
    case "fifteen":
        digit = 15;
        break;
    case "sixteen":
        digit = 16;
        break;
    case "seventeen":
        digit = 17;
        break;
    case "eighteen":
        digit = 18;
        break;
    case "nineteen":
        digit = 19;
        break;
    case "twenty":
        digit = 20;
        break;
    case "thirty":
        digit = 30;
        break;
    case "fourty":
        digit = 40;
        break;
    case "fifty":
        digit = 50;
        break;
    case "sixty":
        digit = 60;
        break;
    case "seventy":
        digit = 70;
        break;
    case "eighty":
        digit = 80;
        break;
    case "ninety":
        digit = 90;
        break;
}

return digit;
Run Code Online (Sandbox Code Playgroud)

我在这里看到了一些关于交换机究竟如何工作的问题,但他们很方便地没有提到带字符串的情况.像上面那样的switch语句能否以任何方式进行优化?

Kon*_*lph 11

正如奥德德所说,你可以把它们放进去Dictionary.但实际上,.NET编译器已经为您完成了这项工作:它构建了一个跳转表(通过a Dictionary<string, SomeDelegate>),允许在O(1)中打开值.

也就是说,我实际上发现使用比这里Dictionary<string, int> 更可读switch.

  • @mafutrct我没有方便的源,但你可以通过使用Reflector或反汇编的.NET可执行文件自己看看. (2认同)

Ode*_*ded 9

您可以将它们放入a Dictionary<string,int>并返回int字符串键.

var wordsToNumbers = new Dictionary<string,int>();
wordsToNumbers.Add("one", 1);
...
wordsToNumbers.Add("ninety", 90);


// elsewhere
return wordsToNumbers[word];
Run Code Online (Sandbox Code Playgroud)

注意:

正如其他人在评论中指出的那样 - 我们的想法是一次构建字典并重用它.一种方法是使用一个字段并在构造函数中填充它,然后在其他方法中使用它.