2012-10-09 13 views
6

Gibt es eine integrierte Lösung in Delphi 2007 zu prüfen, ob ein TStringList enthält ein Teil eines bestimmten Wertes?Delphi: TStringList.Contains?

z.B .:

List.AddObject('This is a string', customStringObject1); 
List.AddObject('This is a mushroom', customStringObject2); 
List.AddObject('Random stuff', customStringObject3); 

für Searching „Dies ist ein“ soll mir „true“ liefern, da die ersten beiden Elemente dieses halb abgetrennte enthalten.

Die einzige Methode, die mir bisher bekannt ist, ist TStringList.find(string,integer), aber dies führt einen vollständigen String-Vergleich, d. H. Nur Suche nach Dies ist eine Zeichenfolge wird True zurückgeben.

Irgendwelche Vorschläge?

Antwort

10

Nicht integriert, aber Sie können die Pos-Funktion auf der Eigenschaft Text verwenden:

Pos('This is a', List.Text) 

Und wenn Sie es wollen integriert werden, können Sie eine Klasse Helfer für TStrings erstellen.

5

Nicht direkt, nein. Sie müssten entweder:

1) Pos() auf der Text Eigenschaft nennen, die nicht effizient ist, wenn Sie eine Menge von Zeichenketten haben.

2) durchlaufen Sie die Liste manuell, rufen Sie Pos() auf jedem String. Effizienter, aber auch mehr Codierung.

3) leiten eine neue Klasse von TStringList und seine virtuellen CompareStrings() Methode überschreiben, Zeichenfolgen zu vergleichen, aber Sie (die Standardimplementierung einfache Anrufe AnsiCompareStr() oder AnsiCompareText() wollen, abhängig von der CaseSensitive Eigenschaft). Geben Sie 0 zurück, wenn Sie eine Übereinstimmung finden. Sie können dann die TStringList.Find()-Methode verwenden, die intern CompareStrings() aufruft (seien Sie vorsichtig, tut dies auch TStringList.Sort(), aber Sie können das vermeiden, wenn Sie stattdessen TStringList.CustomSort() anrufen).