使用带有字符串的Case语句

Gle*_*rse 33 delphi delphi-xe2

说我有一个字符串

'SomeName'
Run Code Online (Sandbox Code Playgroud)

并希望值在case语句中返回.这个可以吗?可以在case语句中使用字符串

Case 'SomeName' of

   'bobby' : 2;
   'tommy' :19;
   'somename' :4000;
else
   showmessage('Error');
end;
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 35

在Jcl库中,你有StrIndex函数StrIndex(Index, Array Of String),它的工作原理如下:

Case StrIndex('SomeName', ['bobby', 'tommy', 'somename']) of 
  0: ..code.. ;//bobby
  1: ..code..;//tommy
  2: ..code..;//somename
else
  ShowMessage('error');
end.
Run Code Online (Sandbox Code Playgroud)

  • 或者只是在最近的Delphi版本中的`IndexStr`.(如果你想要不区分大小写的比较,还有`-Text`版本.) (14认同)
  • 或者只使用标准的AnsiIndexStr函数. (11认同)

RRU*_*RUZ 32

Delphi Case Statement仅支持序数类型.所以你不能直接使用字符串.

但存在另类选择


c32*_*dge 15

@ Daniel的回答指出了我正确的方向,但我花了一段时间才注意到"Jcl Library"部分以及有关标准版本的评论.

在[至少] XE2及更高版本中,您可以使用:

Case IndexStr('somename', ['bobby', 'tommy', 'somename', 'george']) of 
  0: ..code..;                   // bobby
  1: ..code..;                   // tommy
  2: ..code..;                   // somename
 -1: ShowMessage('Not Present'); // not present in array
else
  ShowMessage('Default Option'); // present, but not handled above
end;
Run Code Online (Sandbox Code Playgroud)

此版本区分大小写,因此如果第一个参数是"SomeName",则它将采用该not present in array路径.使用IndexText不区分大小写的比较.

对于较旧的Delphi版本,分别使用AnsiIndexStrAnsiIndexText.

感谢@Daniel,@ The_Fox和@afrazier对这个答案的大部分内容.


ken*_*eno 5

适用于 D7 和德尔福西雅图,

uses StrUtils (D7) system.Ansistring (Delphi Seattle) system.StrUtils (Berlin 10.1)

case AnsiIndexStr(tipo, ['E','R'] )   of
      0: result := 'yes';
      1: result := 'no';
end;
Run Code Online (Sandbox Code Playgroud)