Zitat von
kalmi01:
Moin moin Leuts,
mal so, aus dem Handgelenk würde ich das ehr so angehen:
1.) i := Pos('suchtext', MyStringList.Text);
2.) von der Position i rückwärts nach CR/LF suchen
3.) von der Position i vorwärts nach CR/LF oder #00 suchen
Zwischen den Pos. 1. und Pos. 2. liegt der exakte String, mit
dem man dann einIndex := MyStringList.IndexOf('Msg_1001');
füttern könnte.
Dürfte bei langen Listen auch schneller sein.
Das bezweifle ich, denn
1. Die Get-Methode von MyStringList.Text iteriert über alle Strings und
2. bastelt den Text. Dadrin suchst Du
3. per Pos um dann nochmals mittels
4. IndexOf zu suchen.
Hmm... Ein natives "pos" über alle MyStringList.Text dürfte doch wesentlich schneller sein, auch wenn es nicht befriedigend ist.
Um in einer Liste von Zeilen einen zweiten Teilstring zu suchen, eignet sich die TStringlist nur bedingt. Ok, wem es Schnurz ist, ob das nun 10ms oder 5ms dauert (z.B.) der soll das nehmen, denn dafür reicht es allemal (also, wenn nur wenige tausend Einträge in der Liste sind).
Wenn das eine zeitkritische Angelegenheit ist, würde ich:
1. Keine TStringlist nehmen, sondern
2. einen einzigen String S verwenden, ähnlich MyStringList.Text.
3. Für jede Zeile die StartPosition innerhalb S merken (Z : Array Of Integer) (die Liste ist sortiert!)
4. Mit einem schnelleren Pattern-Matching als POS (QS-Search oder Boyer-Moore für sehr lange Suchstrings) die Position P finden
5. P mit binary search in S suchen.
Ich denke, das dürfte recht fix sein, Es geht natürlich noch schneller (z.B. Pos.5), aber das würde zu weit führen.