Hallo,
als ich die Prozedur
IntersectStrings() bereit stellte, habe ich auch auf die Bedeutung einer Sortierung hingewiesen. Auch die Aktualisierung der ListBox wird ja unterdrückt. Ein Test zeigt bei mir Zeiten (für Sortierung und Selektion) jeweils deutlich unter 100 Millisekunden.
Delphi-Quellcode:
function RandomStr(size: integer): string;
var
i: integer;
begin
SetLength(Result, size);
for i := 1 to Length(Result) do
Result[i] := Chr(Ord('A') + Random(26));
end;
procedure IntersectStrings(sResult, s1, s2: TStrings);
var
i: Integer;
s: string;
begin
sResult.BeginUpdate;
sResult.Clear;
for i := 0 to Pred(s2.Count) do
begin
s := Copy(s2[i], 1, 7);
if s1.IndexOf(s) >= 0 then
sResult.Add(s);
end;
sResult.EndUpdate;
end;
procedure TDemoForm.ButtonClick(Sender: TObject);
var
s: TStringList;
tc: Cardinal;
begin
s := TStringList.Create;
tc := GetTickCount;
s.Assign(ListBox1.Items);
ShowMessage(Format('assigned: %d', [GetTickCount - tc]));
tc := GetTickCount;
s.Sorted := True;
ShowMessage(Format('sorted: %d', [GetTickCount - tc]));
IntersectStrings(ListBox3.Items, s, ListBox2.Items);
ShowMessage(Format('selected: %d', [GetTickCount - tc]));
s.Free;
end;
procedure TDemoForm.FormCreate(Sender: TObject);
const
CNT1 = 10000;
CNT2 = 2000;
var
i: Integer;
begin
with ListBox1.Items do
begin
BeginUpdate;
for i := 1 to CNT1 do
Add(Format('%.2d-%.4d', [Random(100), Random(10000)]));
EndUpdate;
end;
with ListBox2.Items do
begin
BeginUpdate;
for i := 1 to CNT1 do
Add(Format('%.2d-%.4d_%s', [Random(100), Random(10000), RandomStr(5)]));
EndUpdate;
end;
end;
Ich vermute, dass einfach nicht sortiert worden ist. Sortiert wird die große Liste und diese wird auch als zweiter Parameter übergeben. Die kleinere Liste wird als dritter Parameter übergeben und enthält die Einträge mit angehängtem String.
Grüße vom marabu