查找字符串是否在列表中的最佳方法(无泛型)

时间:2008-10-29 12:37:48

标签: delphi delphi-2007

我想做这样的事情:

Result = 'MyString' in [string1, string2, string3, string4];

这不能用于字符串,我不想做这样的事情:

Result = (('MyString' = string1) or ('MyString' = string2));

另外我认为创建一个StringList来做这件事太复杂了。

还有其他方法可以达到这个目的吗?

感谢。

4 个答案:

答案 0 :(得分:56)

你可以使用AnsiIndexText(const AnsiString AText,字符串AValues的const数组):integer或MatchStr(const AText:string; const AValues:string of array):Boolean;

这样的东西
Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1);

Result := MatchStr('Hi', ['foo', 'Bar']); 
  

AnsiIndexText返回0偏移量   找到的第一个字符串的索引   与AText匹配的AValues   的不区分大小写即可。如果是字符串   由AText指定没有   (可能不区分大小写)匹配   AValues,AnsiIndexText返回-1。   比较基于当前   系统区域设置。

     

MatchStr确定是否有任何   数组AValues中的字符串匹配   AText使用大小写指定的字符串   敏感比较。它返回true   如果至少有一个字符串   数组匹配,如果没有,则返回false   字符串匹配。

注意AnsiIndexText不区分大小写,MatchStr区分大小写,所以我猜这取决于您的使用情况

编辑:2011-09-3 :刚刚找到这个答案,并且我想补充说明,在Delphi 2010中还有一个MatchText函数与{ {1}}但不区分大小写。 - 拉里

答案 1 :(得分:7)

Burkhard的代码有效,但即使找到了匹配项,也会在列表上不必要地进行迭代。

更好的方法:

function StringInArray(const Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := True;
  for I := Low(Strings) to High(Strings) do
    if Strings[i] = Value then Exit;
  Result := False;
end;

答案 2 :(得分:1)

这是一个完成工作的功能:

function StringInArray(Value: string; Strings: array of string): Boolean;
var I: Integer;
begin
  Result := False;
  for I := Low(Strings) to High(Strings) do
  Result := Result or (Value = Strings[I]);
end;

实际上,您将MyString与Strings中的每个字符串进行比较。只要找到一个匹配,就可以退出for循环。

答案 3 :(得分:-4)

你可以试试这个:

Result := Pos(MyString, string1+string2+string3+string4) > 0