あなたが速い何かをしたい場合は、ドン」あなたのデータをTListViewに保存しないでください。
TStringListを使用してリストを保存し、仮想モードでTListViewを使用します。
TStringList.Items []からの読み取りは、TListView.Items []プロパティからの読み取りよりも何倍も高速です。
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;
あなたも、より速くそれを得るためにバイナリ検索を使用することができます:あなたはボイドの項目がリストに存在しないことを確認している場合
が、これは使用しています。しかし、PWord()のトリックでは、50000項目のリストに気づかないでしょう。
比較中に一時的な文字列が作成されないため、PC(pointer(List [i]))^ = Vはcopy(List [i]、1,2)= Char1 + Char2の方が高速です。しかし、List [i] = ''がない場合、つまりポインタ(List [i])= nilがない場合にのみ機能します。
このコードをすべてのバージョンのDelphi(Delphi 2009の前後)でコンパイルするには、{$ ifdef UNICODE}とsizeof(char)を追加しました。
範囲の最初と最後の要素を見つけるためにバイナリチョップを使用することについて知っているので、すでに自分の質問に答えているようです。正確に何が助けを必要としますか? –