博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
於Delphi的Case述句中使用字串當作判別變數 (转)
阅读量:2499 次
发布时间:2019-05-11

本文共 1519 字,大约阅读时间需要 5 分钟。

於Delphi的Case述句中使用字串當作判別變數 (转)[@more@]

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

 

陳佳新╱to:jarsing@cina.chu.edu.tw" rel="nofollow">jarsing@cina.chu.edu.tw

 

● 前言

 

提到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述句的組合體。此時真希望我們用的是,因為下面的程式碼是可被其編譯器允許的(請參閱[5]):

 

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

  #002  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  方案五:使用TStringList

v  方案六:實作多載函示

v  方案七:應用現成函示

 

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-1007732/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-1007732/

你可能感兴趣的文章
4基本动画
查看>>
10个小技巧助您写出高性能的ASP.NET Core代码
查看>>
JavaScript中的 JSON 和 JSONP
查看>>
字符串相关工具类
查看>>
iOS:图标尺寸
查看>>
项目冲刺,20151118
查看>>
O055、Detach Volume 操作
查看>>
MyBatis学习(3)
查看>>
otrs离线部署
查看>>
spring ioc原理(看完后大家可以自己写一个spring)
查看>>
[codevs 1039]数的划分
查看>>
【会议记录】第一次例会(9.22)记录
查看>>
SpringBoot与缓存
查看>>
java内存分析
查看>>
current_date与sysdate区别
查看>>
流畅设计 Fluent Design System 中的光照效果 RevealBrush,WPF 也能模拟实现啦!
查看>>
Android源码解析01:下载Android源码
查看>>
NodeJS05
查看>>
Windows10更新后,远程桌面无法登录服务器 提示远程桌面协议 CredSSP 出现漏洞
查看>>
开发一个移动应用之前应该思考的5件事
查看>>