是否有可能优化字符串上的大开关
本文关键字:开关 字符串 有可能 优化 是否 | 更新日期: 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];
您可以使用字典而不是大型开关。至于计时,是对开关计时还是对字典计时。我认为字典会更简洁,但可能执行相同的功能。
-
测量是否需要。
-
最简单的方法是字典。它也非常适合您的用例。
当字符串的数量变得足够大,使得哈希表比一系列比较更快时,Switch on string将切换到使用哈希表。