如何检查数组中是否存在字符串?

max*_*fax 17 arrays delphi string

我有这个代码:

var
  ExtString: string;
const
  Extensions : array[0..4] of string = ('.rar', '.zip', '.doc', '.jpg', '.gif');

if ExtString in Extensions then
Run Code Online (Sandbox Code Playgroud)

在最后一行,我收到一个错误:

[DCC错误] E2015运算符('then')不适用于此操作数类型

我想我不能这样做,所以我怎样才能正确执行我的任务呢?

Rob*_*ove 23

正如您所发现的那样,使用时无法检查字符串数组中的字符串in.

您可以使用此函数而不是if语句.

function StrInArray(const Value : String;const ArrayOfString : Array of String) : Boolean;
var
 Loop : String;
begin
  for Loop in ArrayOfString do
  begin
    if Value = Loop then
    begin
       Exit(true);
    end;
  end;
  result := false;
end;
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它.

if StrInArray(ExtString,Extensions) then

StrUtils.pas这个已经定义了.

function MatchStr(const AText: string; const AValues: array of string): Boolean; 
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,它被命名为MatchStr的+1.它应该是名词而不是动词.我必须说我不是新退出语法的粉丝.但是如果你打算使用它,你不应该一直使用它.在同一例程中使用result和exit()会使解析变得更加困难. (5认同)
  • 区分大小写敏感.文件系统不区分大小写,您可以找到大量带有.JPG扩展名的文件.上面的代码会错过这个. (4认同)
  • @Misha:那就是`MatchText`的目的。在某些Delphi版本中,它仅以“ AnsiMatchText”(以及“ WideStrings.pas”中的“ WideMatchText”)形式存在。 (2认同)

Mis*_*sha 9

从常量数组​​初始化TStringList实例并使用IndexOf().

  • 太重量级,简单循环更好 (4认同)
  • 如果它经常完成并且 TStringList 是持久的,则不会。谁知道这还可以用来做什么? (3认同)
  • 使字符串列表永久存在,您将放弃线程安全性。即使这样,您也必须分配给毫无意义的字符串列表。循环最好没有问题。弦乐单子是敲击螺母的大锤。 (3认同)
  • TStringList.IndexOf不是重量级的.一个简单的for循环并不是更好. (3认同)

Ger*_*lí- 8

您可以使用函数IndexStr(区分大小写)或IndexText(不区分大小写)来System.StrUtils查找数组内的字符串并检索索引。

var
  ExtString: string;
const
  Extensions : array[0..4] of string = ('.rar', '.zip', '.doc', '.jpg', '.gif');
begin
  if (IndexStr(ExtString, Extensions) <> -1) then
    ShowMessage('Finded')
  else
    ShowMessage('Not finded');
Run Code Online (Sandbox Code Playgroud)

来自 embarcadero 的 docwiki 帮助链接