У меня есть 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 не является вариантом.
Будет ли этот метод работать?
Спасибо