找回密码
 加入
搜索
查看: 2500|回复: 6

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

  [复制链接]
发表于 2017-4-7 09:54:59 | 显示全部楼层 |阅读模式
本帖最后由 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[0]
    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[0]
    if $m=$arr[$i]  then   $sMsg = $brr[$i]
        next
除了资源浪费,在逻辑上又觉得跟switch语句不一样。
最终目的
减少书写代码时重复复制粘贴劳动是一方面
另一方面是能精简代码,使之更直观,效率更高。
发表于 2017-4-7 10:42:39 | 显示全部楼层
我也有过这样的经历,Switch里面Case有30多个。后面竟然发现较后面的Case语句竟然不起作用,只好分开,多加几组Switch Case语句才可以有效。期待有更精简的方案出现。
发表于 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)

评分

参与人数 1金钱 +10 收起 理由
cashiba + 10

查看全部评分

 楼主| 发表于 2017-4-7 12:32:42 | 显示全部楼层
这个要看情况的。
比如你这个
1361739590 发表于 2017-4-7 11:25

代码改自于帮助文件示例,只是为了说清问题,实际操作中不会这么有规律阿
case条件是数组,不一定就是连续整数
发表于 2017-4-7 12:52:00 | 显示全部楼层
本帖最后由 1361739590 于 2017-4-7 12:53 编辑

回复 4# cashiba


    所以要 具体情况具体 来分析,看你分类分的好不好了。楼上那个30多个case中怀疑有重复的地方。
想用switch的话,Case后面是具体的值。Select的case后面是表达式。
不同的情况不一样,或者不用上面的两种。
发表于 2017-4-7 13:28:16 | 显示全部楼层
回复 1# cashiba

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

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

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

评分

参与人数 1金钱 +10 收起 理由
cashiba + 10

查看全部评分

 楼主| 发表于 2017-4-7 21:39:53 | 显示全部楼层
回复  cashiba
kk_lee69 发表于 2017-4-7 13:28

嗯,这个办法应该可行,把表达式映射转换一下。
从运行效率上来说,老老实实一个case一个case的堆砌,虽然代码写起来麻烦,但是运行起来也许最快捷稳定有效....
就不纠结这个喽
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-27 06:56 , Processed in 0.078540 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表