可以使用 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 和最短的值),因为没有。
我在 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 和最短的值),因为没有。