於Delphi的Case述句中使用字串當作判別變數

原创 2002年07月04日 10:03:00

DelphiCase述句中使用字串當作判別變數<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

陳佳新╱jarsing@cina.chu.edu.tw

 

● 前言

 

提到Case述句(statement),我們首先會聯想到的應用案例莫過於就是透過一個判別變數,讓程式流程依照不同的條件狀況來選擇符合的路徑繼續執行下去。或者是,當我們的程式中出現了一連串的if else if述句組合時,我們也經常都會想到要利用Case述句來簡化程式碼並藉以提升其可讀性與執行效率。

 

但是在某些情況下,Case述句並無法應用於我們的程式當中,因為其所允許接受的判別變數僅限於任何形式的運算式(expression)與序數型別(ordinal type),這所謂的「序數型別」指的就是整數、字元、列舉、布林和集合等「有次序」的,而且可以應用於諸如Ord()Pred()Succ()Low()High()等函示的型別(請參閱[1])。

 

不幸的是,字串(string)顯然並非序數型別的一種,而在某些時候(底下馬上會舉例),當條件變數的型別是字串而且條件分支又相當多時,儘管無奈,然而除了使用大量的ifelse if述句之外,似乎也別無他法了,唉。

 

例如下面的程式碼在Delphi中便不被允許:

 

     #001 var

     #002      Str: String;  // 宣告String型別的判別變數

     #003     begin

     #004      case Str of  // 錯誤訊息: Ordinal type required

     #005          // ...

     #006      end;

     #007 end;

 

這根本就無法通過編譯嘛,因此傳統的解決方案通常是將之轉換為大量的ifelse if述句的組合體。此時真希望我們用的是Visual Basic,因為下面的程式碼是可被其編譯器允許的(請參閱[5]):

 

     #001 Dim Str As String     ' 宣告String型別的判別變數

     #002     Select Case Str ' 等同於DelphiCase述句

     #003      '...

     #004 End Select        ' OK, 通過編譯

 

於是在本文中,筆者試圖以此問題為出發點,在「除了轉換為ifelse if述句組合的傳統解決方案之外」找尋其他可行的因應之道,並由衷地希望本文對於面臨此問題而亟欲尋求解決方法的人(看了[12]-[14]之後,筆者更發現確實如此)能夠有所幫助。

 

先預告一下好了,筆者打算介紹7種解決方案,其中前5種方法乃是節錄或延伸自[9]-[13]的內容,而第6種則是筆者實作的綜合性多載化(overloading)版本。這些方案分別是:

 

v           方案一:搜尋字串陣列

v           方案二:使用實數索引

v           方案三:利用雜湊函數

v           方案四:巢套case述句

v           方案五:使用TStringList

v           方案六:實作多載函示

v           方案七:應用現成函示

 

本文將從複習條件述句(內容主要參考[1][4])與認識字串(內容主要參考[2])等主題開始,熟悉Delphi者可略過此部分,直接閱讀〈效能議題〉小節直到文末為止。

delphi中Case语法的使用方法

Case 语句 If...Then…Else 语句适合选项较少的情况,如果有很多选项的话利用If 语句就比较麻烦,在这种情况下,Case 语句就容易多了。Case 语句的语法如下: ...
  • wozengcong
  • wozengcong
  • 2014年08月31日 11:10
  • 6937

case语句中允许使用的值有哪些?

有byte,int,short,char。 以上均为整数类型,但是同为整数long不行,因为case语句可接受范围只在int型和int以下,比int大就算是整数类型也不行。...
  • w18743260935
  • w18743260935
  • 2016年11月22日 23:43
  • 105

SAP币别转换BAPI

币别转换BAPI用 CURRENCY_CONVERTING_FACTOR
  • yuqinying112
  • yuqinying112
  • 2013年11月05日 13:50
  • 927

Case when 与Update语句的使用

UPDATE ReportDefinition SET ReportAbandonTime = CASE WHEN @ReportStatus = '4' THEN GetDate() ELSE N...
  • wyzlwyzl
  • wyzlwyzl
  • 2011年10月14日 11:33
  • 2012

Delphi在case语句中使用字符串

Delphi在case语句中使用字符串 在case语句中使用字符串    (**** 转载敬请注明-本文出处:南山古桃(nsgtao)的百度空间:http://hi.baidu.com/nsgta...
  • singbonpei
  • singbonpei
  • 2016年08月02日 09:10
  • 123

delphi 在 case 语句中使用字符串

 非常遗憾 Delphi 的 case 语句不支持字符串, 但我觉得这也可能是基于效率的考量;如果非要在 case 中使用字符串, 也不是不可以变通, 这里提供了五种方法. 本例效果图: 代码文件: ...
  • zjlme
  • zjlme
  • 2008年08月28日 12:33
  • 995

Delphi在case 语句中使用字符串

这种方法主要用到 RTTI 的特性。该方法的主要思路是,先把所有的备选项声名为一个枚举类型的值,只要把要找的字符串也转换为枚举型,就可以用 case 语句了。   uses TypInfo; // ...
  • Roube
  • Roube
  • 2012年03月29日 22:15
  • 1392

sql中的where后面使用case when

有这样一段sql文。 select B.bCol_1,B.bCol_2,C.cCol_1 from TBL_B B left join TBL_C C on B.bCol_Key = C.cCo...
  • zunguitiancheng
  • zunguitiancheng
  • 2013年06月08日 03:35
  • 3605

字串或二进位资料会被截断。/r/n陈述式已经结束。

今天写代码遇到了这样的问题,C# “字串或二进位资料会被截断。/r/n陈述式已经结束。”,我在网上查了一下,原来是我在做insert或者update的时候,textbox里面的内容长度超过了数据库的字...
  • sweetqueen1
  • sweetqueen1
  • 2010年09月23日 11:05
  • 3837

Android Manifest.xml文件的结构及作用

原文链接:http://android.eoe.cn/topic/android_sdk   每一个应用程序在工程的根目录下必须要有一个AndroidManifest.xml文件(一定要用这个名称...
  • u011352918
  • u011352918
  • 2013年07月17日 14:49
  • 849
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:於Delphi的Case述句中使用字串當作判別變數
举报原因:
原因补充:

(最多只允许输入30个字)