Wenn Sie etwas schnell, don‘ t speichern Sie Ihre Daten in einem TListView.
Verwenden Sie eine TStringList, um Ihre Liste zu speichern, und verwenden Sie dann eine TListView im virtuellen Modus.
Das Lesen von TStringList.Items [] ist viel schneller als das Lesen von einer TListView.Items [] -Eigenschaft.
Wenn Sie sicher sind, dass kein Hohlraum Element in der Liste vorhanden ist, verwendet diese:
procedure Extract(List, Dest: TStrings; Char1, Char2: char);
var i,j: integer;
V: cardinal;
type PC = {$ifdef UNICODE}PCardinal{$else}PWord{$endif};
begin
V := ord(Char1)+ord(Char2) shl (8*sizeof(char));
Dest.BeginUpdate;
Dest.Clear;
for i := 0 to List.Count-1 do begin
if PC(pointer(List[i]))^=V then begin
for j := i to List.Count-1 do begin
Dest.Add(List[j]);
if PC(pointer(List[j]))^<>V then
break; // end the for j := loop
end;
break; // end the for i := loop
end;
Dest.EndUpdate;
end;
Sie binäre Suche verwenden können, es noch schneller zu bekommen. Aber mit dem Trick PWord() auf einer Liste von 50000 Elementen werden Sie es nicht bemerken.
Beachten Sie, dass PC (Zeiger (Liste [i]))^= V ist eine schnellere Version von Kopie (List [i], 1,2) = Char1 + Char2, da keine temporäre Zeichenfolge während des Vergleichs erstellt wird. Aber es funktioniert nur, wenn keine List [i] = '', d. H. Kein Zeiger (List [i]) = Nil.
Ich habe einen {$ ifdef UNICODE} und sizeof (char) hinzugefügt, damit dieser Code mit allen Versionen von Delphi kompiliert werden kann (vor und nach Delphi 2009).
Da Sie wissen, einen binären Chop zu verwenden, um die ersten und letzten Elemente des Bereichs zu finden, scheinen Sie bereits Ihre eigene Frage beantwortet zu haben. Wofür brauchst du genau Hilfe? –