ソートされ、一意のファイル名を含む 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 からの切り替えはオプションではないことに注意してください。
この方法は機能しますか?
ありがとう