我有一个 TStringList 已排序并包含唯一的文件名。该列表可以是任意大小(因此可以是数十万个条目)。我想检查是否有任何条目以特定字符串开头(即文件是否在子文件夹中)。连续扫描列表并使用 StartsText 很容易,但这不是一个理想的解决方案。
使用 TStringList.Find() 代码作为起点,我创建了一个我认为是解决方案的函数,但我想确定一下。不要担心以下不是类的成员(FList 是正在搜索的 TStringList 实例),StartsFilename 的工作方式与 StartsText 相同:
function ShortcutFind(const S: string): Boolean;
var
L, H, I, C: Integer;
begin
Result := False;
L := 0;
H := FList.Count - 1;
while L <= H do begin
I := (L + H) shr 1;
if TFilenameUtils.StartsFilename(FList[I], aFolder) then begin
Result:=TRUE;
Exit;
end;
C := FList.CompareStrings(FList[I], S);
if C < 0 then
L := I + 1
else begin
H := I - 1;
if C = 0 then begin
Result := True;
if FList.Duplicates <> dupAccept then L := I;
end;
end;
end;
end;
基本上,唯一真正的变化是它在移动到下一个要比较的条目之前进行检查。
请注意,不能从 TStringList 切换。
这种方法行得通吗?
谢谢