cashiba 发表于 2017-4-7 09:54:59

较长的Switch...Case...语句如何精简?[已解决]

本帖最后由 cashiba 于 2017-4-7 21:41 编辑

local $arr=['12','1','2','3','4','5','6','7','8','9','10','11','12']
local $brr=['15','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
Switch @Month
    Case 1
      $sMsg = "a"
    Case 2
      $sMsg = "b"
    Case 3
      $sMsg = "c"
    Case 4
      $sMsg = "d"
    Case 5
      $sMsg = "e"
    Case 6
      $sMsg = "f"
    Case 7
      $sMsg = "g"
    Case 8
      $sMsg = "h"
    Case 9
      $sMsg = "i"
    Case 10
      $sMsg = "j"
    Case 11
      $sMsg = "k"
    Case 12
      $sMsg = "l"
EndSwitch如上,条件选择语句,与两个数组对应。
假如数组元素比较多,达数百上千个的话,switch语句将很长。
用如下循环方式local $arr=['12','1','2','3','4','5','6','7','8','9','10','11','12']
local $brr=['15','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
Switch $arr
        for $i=1 to $arr
    Case $arr[$i]
      $sMsg = $brr[$i]
        next
EndSwitch书写代码的话语法上又不可行。
改成如下方式一一赋值的话,每选择一次都要遍历一次数组local $arr=['12','1','2','3','4','5','6','7','8','9','10','11','12']
local $brr=['15','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o']
        for $i=1 to $arr
    if $m=$arr[$i]then   $sMsg = $brr[$i]
        next
除了资源浪费,在逻辑上又觉得跟switch语句不一样。
最终目的
减少书写代码时重复复制粘贴劳动是一方面
另一方面是能精简代码,使之更直观,效率更高。

kemyliu 发表于 2017-4-7 10:42:39

我也有过这样的经历,Switch里面Case有30多个。后面竟然发现较后面的Case语句竟然不起作用,只好分开,多加几组Switch Case语句才可以有效。期待有更精简的方案出现。

1361739590 发表于 2017-4-7 11:25:54

本帖最后由 1361739590 于 2017-4-7 11:28 编辑

这个要看情况的。
比如你这个
local $brr=['12','a','b','c','d','e','f','g','h','i','j','k','l']
Switch @MON
    Case 1 to 12
                $sMsg = $brr[@MON]
EndSwitch
MsgBox(0,"",$sMsg)

cashiba 发表于 2017-4-7 12:32:42

这个要看情况的。
比如你这个
1361739590 发表于 2017-4-7 11:25 http://www.autoitx.com/images/common/back.gif
代码改自于帮助文件示例,只是为了说清问题,实际操作中不会这么有规律阿
case条件是数组,不一定就是连续整数
{:face (288):}

1361739590 发表于 2017-4-7 12:52:00

本帖最后由 1361739590 于 2017-4-7 12:53 编辑

回复 4# cashiba


    所以要 具体情况具体 来分析,看你分类分的好不好了。楼上那个30多个case中怀疑有重复的地方。
想用switch的话,Case后面是具体的值。Select的case后面是表达式。
不同的情况不一样,或者不用上面的两种。

kk_lee69 发表于 2017-4-7 13:28:16

回复 1# cashiba

DIM $arr
$arr="01"
$arr="1月"
$arr="02"
$arr="2月"
$arr="03"
$arr="3月"
$arr="04"
$arr="4月"
$arr="05"
$arr="5月"
$arr="06"
$arr="6月"
$arr="07"
$arr="7月"
$arr="08"
$arr="8月"
$arr="09"
$arr="9月"
$arr="10"
$arr="10月"
$arr="11"
$arr="11月"
$arr="12"
$arr="12月"

For $i=0 To UBound($arr)-1 STEP 1
        IF $arr[$i]=@MON Then $M=$i
Next

Switch $M
        Case $M
                MsgBox(0,"",$arr[$M])
EndSwitch

cashiba 发表于 2017-4-7 21:39:53

回复cashiba
kk_lee69 发表于 2017-4-7 13:28 http://www.autoitx.com/images/common/back.gif
嗯,这个办法应该可行,把表达式映射转换一下。
从运行效率上来说,老老实实一个case一个case的堆砌,虽然代码写起来麻烦,但是运行起来也许最快捷稳定有效....
就不纠结这个喽
{:face (239):}
页: [1]
查看完整版本: 较长的Switch...Case...语句如何精简?[已解决]