于Delphi的Case述句中使用字串当作判别变数陈佳新╱[email protected]● 前言提到Case述句(statement),我们首先会联想到的应用案例莫过于就是透过一个判别变数,让程式流程依照不同的条件状况来选择符合的路径继续执行下去。或者是,当我们的程式中出现了一连串的if与else if述句组合时,我们也经常都会想到要利用Case述句来简化程式码并借以提升其可读性与执行效率。但是在某些情况下,Case述句并无法应用于我们的程式当中,因为其所允许接受的判别变数仅限于任何形式的咚闶剑╡xPRession)与序数型别(ordinal type),这所谓的「序数型别」指的就是整数、字元、列举、布林和集合等「有次序」的,而且可以应用于诸如Ord()、Pred()、Succ()、Low()与High()等函示的型别(请参阅[1])。不幸的是,字串(string)显然并非序数型别的一种,而在某些时候(底下马上会举例),当条件变数的型别是字串而且条件分支又相当多时,尽管无奈,然而除了使用大量的if与else if述句之外,似乎也别无他法了,唉。例如下面的程式码在Delphi中便不被允许: #001 var #002 Str: String; // 宣告String型别的判别变数#003 begin #004 case Str of // 错误讯息: Ordinal type required #005 / / ... #006 end; #007 end;这根本就无法通过编译嘛,因此传统的解决方案通常是将之转换为大量的if与else if述句的组合体。此时真希望我们用的是Visual Basic,因为下面的程式码是可被其编译器允许的(请参阅[5]): #001 Dim Str As String ' 宣告String型别的判别变数#002 Select Case Str ' 等同于Delphi的Case述句#003 '... #004 End Select ' OK, 通过编译于是在本文中,笔者试图以此问题为出发点,在「除了转换为if与else if述句组合的传统解决方案之外」找寻其他可行的因应之道,并由衷地希望本文对于面临此问题而亟欲寻求解决方法的人(看了[12]-[14]之后,笔者更发现确实如此)能够有所帮助。先预告一下好了,笔者打算介绍7种解决方案,其中前5种方法乃是节录或延伸自[9]-[13]的内容,而第6种则是笔者实作的综合性多载化(overloading)版本。这些方案分别是:v 方案一:搜寻字串阵列v 方案二:使用实数索引v 方案三:利用杂凑函数v 方案四:巢套case述句v 方案五:使用TStringListv 方案六:实作多载函示v 方案七:应用现成函示本文将从复习条件述句(内容主要参考[1]与[4])与认识字串(内容主要参考[2])等主题开始,熟悉Delphi者可略过此部分,直接阅读〈效能议题〉小节直到文末为止