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

23

我有这段代码:

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

if ExtString in Extensions then

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

[DCC Error] E2015 运算符 ('then') 对这个操作数类型不适用

我认为我不能这样做,那么我该如何正确地执行我的任务?


"in" 运算符不适用于这些操作数类型。 - Premature Optimization
1
这是对OP尝试失败的解释,但不是真正的答案,因为问题是“那么我该如何正确执行此任务?” - jpfollenius
可能是重复的问题,参考最佳方法查找列表中是否存在字符串(不使用泛型) - Jay Elston
请使用 AnsiIndexStr() 或 AnsiIndexText()。参见 Best way to find if a string is in a list (without generics) - Jay Elston
3个回答

31

正如您发现的那样,您无法使用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;

你可以这样调用它。

if StrInArray(ExtString,Extensions) then

StrUtils.pas 已经定义了这个函数。

function MatchStr(const AText: string; const AValues: array of string): Boolean; 

8
对于MatchStr,尽管它的名称不太理想,但我还是会点赞。它应该是一个名词而不是动词。我必须说,我不是新退出语法的粉丝。但如果你要使用它,那么你应该保持一致性。在同一个例程中同时使用result和exit()使得它更难解析。 - David Heffernan
4
请注意大小写敏感性。文件系统是不区分大小写的,你可能会找到许多具有 .JPG 扩展名的文件。上面的代码将会忽略这些文件。 - Misha
4
“MatchText”的作用就是这样。在某些Delphi版本中,它只存在于“AnsiMatchText”(也许是“WideStrings.pas”中的“WideMatchText”)中。” - afrazier

8
从常数数组初始化TStringList实例并使用IndexOf()。

6
太重了,用简单的循环更好。 - David Heffernan
3
如果频繁进行操作且TStringList是持久的,则不会出现问题。谁知道这还可能用于什么其他用途呢? - Misha
3
使字符串列表持久化会放弃线程安全性。即使如此,你仍需对无用的字符串列表进行赋值。毫无疑问,循环更好。使用字符串列表就像杀鸡焉用牛刀。 - David Heffernan
3
TStringList.IndexOf不是重量级操作。使用简单的for循环并不更好。 - Warren P
@David:需要做出权衡。TStringList还带有来自VCL的(快速)排序和二进制搜索功能。 - afrazier
显示剩余3条评论

8
你可以使用来自 System.StrUtils 的函数 IndexStr(区分大小写)或 IndexText(不区分大小写)来查找数组内的字符串并检索索引。
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');

Embarcadero docwiki上的帮助链接(英文)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接