可以使用 IndexOf 在 Delphi 中的 TStringList 中搜索两个或多个备用字符串吗?

Can IndexOf be used to search for two or more alternate strings in a TStringList in Delphi?

我在 Delphi 2005 年使用了 IndexOf() 来提取 TStrinList 的索引。目前它只搜索一个字符串,但我希望它搜索替代字符串。例如,要搜索 'String A'、'String B' 或 'String C' 并给我找到第一个的索引。

是否可以使用 IndexOf() 或其他方法来做到这一点?

没有执行此操作的内置功能。

您可以多次调用 IndexOf。然后取不等于-1的最小索引。这实现起来既快速又容易,但不会有最佳性能。

如果性能很重要,另一种选择是滚动您自己的函数来执行搜索。对无序列表进行足够简单的线性搜索。如果您想在有序列表上使用二进制搜索,则稍微复杂一些。

没有内置方法可以执行此操作,也无法使用对 IndexOf 的单个调用来实现它。

如果您需要找到第一个出现的那个,您需要对 IndexOf 进行三个单独的调用,每个值一个,return 最小的一个指数。一个简单的包装器就像这样(连同一个控制台应用程序来测试它):

program Project2;

{$APPTYPE CONSOLE}

uses
  System.SysUtils, Classes;


function GetLowestIndexOf(const SL: TStrings; const AValues: array of string): Integer;
var
  Idx, Temp: Integer;
begin
  // Initialize with first test results (which may be -1)
  Result := SL.IndexOf(AValues[0]);
  for Idx := 1 to High(AValues) do
  begin
    Temp := SL.IndexOf(AValues[Idx]);
    if (Temp > -1) and ((Temp < Result) or (Result = -1)) then
      Result := Temp;
  end;
end;

var
  Test: Integer;
  SL: TStringList;

begin
  SL := TStringList.Create;
  SL.Text := 'Some Value'#13'String C'#13'Another Value'#13'Something Else'#13 +
             'String A'#13'Yet Another'#13'String B';
  Test := GetLowestIndexOf(SL, ['String A', 'String B', 'String C']);
  WriteLn(SL[Test]);
  ReadLn;
end.

如果您要检查的项目列表很长,并且您已经找到可能的最低索引(介于 1 和最短的值),因为没有。