是否有可能优化字符串上的大开关

本文关键字:开关 字符串 有可能 优化 是否 | 更新日期: 2023-09-27 18:06:21

我正在查看我的一个朋友的库,因为他问关于优化的问题,我遇到了这样一段代码:

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;

我在这里看到了一些关于开关究竟是如何工作的问题,但它们很方便地没有提到字符串的情况。像上面这样的switch语句可以以任何方式进行优化吗?

是否有可能优化字符串上的大开关

正如Oded所说,您可以将它们放在Dictionary中。但事实上,. net编译器已经为你做了这件事:它建立了一个跳转表(通过Dictionary<string, SomeDelegate>),允许在0(1)中打开值。

这就是说,我实际上发现使用Dictionary<string, int> switch更具可读性

您可以将这些放在Dictionary<string,int>中,并返回字符串键的int

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

// elsewhere
return wordsToNumbers[word];

注意:

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

在这种情况下,更好的优化方法可能是使用静态Dictionary:

private static readonly Dictionary<string, long> _lookup = new Dictionary<string, long>
   {
       { "one", 1 },
       { "two", 2 },
       { "three", 3 },
       // etc...
   }

然后直接访问使用:

var number = "one";
var result = _lookup[number];

您可以使用字典而不是大型开关。至于计时,是对开关计时还是对字典计时。我认为字典会更简洁,但可能执行相同的功能。

  1. 测量是否需要。

  2. 最简单的方法是字典。它也非常适合您的用例。

当字符串的数量变得足够大,使得哈希表比一系列比较更快时,Switch on string将切换到使用哈希表。