2008-10-29 4 views
26

ich so etwas will:Der beste Weg, um herauszufinden, ob ein String in einer Liste (ohne Generika)

Result = 'MyString' in [string1, string2, string3, string4]; 

Dies kann nicht mit Strings verwendet werden, und ich will nicht, etwas zu tun, wie dies:

Result = (('MyString' = string1) or ('MyString' = string2)); 

Auch ich denke, dass das Erstellen einer StringList genau das zu tun ist zu komplex.

Gibt es eine andere Möglichkeit, dies zu erreichen?

Danke. Hier

Antwort

50

Sie könnten AnsiIndexText verwenden (const Ansi AText, const Array von String AValues): integer oder MatchStr (const AText: string; const AValues: array of string): Boolean;

So etwas wie

Result := (AnsiIndexText('Hi',['Hello','Hi','Foo','Bar']) > -1); 

oder

Result := MatchStr('Hi', ['foo', 'Bar']); 

AnsiIndexText gibt die 0-Offset Index der ersten Zeichenkette, die es in AValues ​​findet, die AText Fall-unsensibel entspricht. Wenn die von AText angegebene Zeichenfolge keine (möglicherweise case-insensitive) Übereinstimmung in AValues ​​aufweist, gibt AnsiIndexText -1 zurück. Die Vergleiche basieren auf dem aktuellen Gebietsschema des Systems .

MatchStr bestimmt, wenn eine der Zeichenkette in dem Array AValues ​​spezifizierte die Zeichenfolge Übereinstimmen von AText einen Fall sensitiven Vergleich verwendet. Sie gibt true zurück, wenn mindestens eine der Zeichenfolgen im Array übereinstimmt, oder false, wenn keine der Zeichenfolgen übereinstimmt.

Hinweis AnsiIndexText hat case-insensitiv und MatchStr Groß- und Kleinschreibung, also denke ich es auf die Nutzung

EDIT hängt: 2011.09.03: Gerade diese Antwort gefunden und dachte, dass ich eine Notiz hinzufügen würde das, in Delphi 2010 gibt es auch eine MatchText Funktion, die die gleiche ist wie MatchStr, aber Fall insenstive.- Larry

+0

Eigentlich gibt es eine bessere, nur ein wenig in der StrUtils.pas gesucht und die MatchStr, die eine Boolean zurückgibt gefunden: Ergebnis: = MatchStr ('Hallo' ['foo', 'Bar']); Bitte fügen Sie es zu Ihrer Antwort hinzu. –

+0

MatchStr und MatchText sind auch in Delphi 2007 verfügbar. –

+0

irgendein Äquivalent für Delphi 7? – CyprUS

1

ist eine Funktion, die die Arbeit erledigt:

function StringInArray(Value: string; Strings: array of string): Boolean; 
var I: Integer; 
begin 
    Result := False; 
    for I := Low(Strings) to High(Strings) do 
    Result := Result or (Value = Strings[I]); 
end; 

In der Tat, Sie vergleichen MyString mit jeder Saite in Strings. Sobald Sie einen passenden finden, können Sie die for-Schleife verlassen.

+0

Dies funktioniert, aktualisieren Sie bitte Ihren Code mit dem Delphi: Funktion StringInArray (Wert: string; Streicher: Array von string): Boolean; var I: Ganzzahl; beginnen Ergebnis: = Falsch; für I: = niedrig (Strings) zu hoch (Strings) do Ergebnis: = Ergebnis oder (Wert = Strings [I]); Ende; –

+0

Es ist schwer, ein n00b zu sein und nicht in der Lage sein, Sachen zu bearbeiten :( –

7

Der Code von Burkhard funktioniert, aber iteriert unnötigerweise über die Liste, selbst wenn eine Übereinstimmung gefunden wird.

besserer Ansatz:

function StringInArray(const Value: string; Strings: array of string): Boolean; 
var I: Integer; 
begin 
    Result := True; 
    for I := Low(Strings) to High(Strings) do 
    if Strings[i] = Value then Exit; 
    Result := False; 
end; 
-4

Sie können dies versuchen:

Result := Pos(MyString, string1+string2+string3+string4) > 0 
+3

Sorry, aber Ihre Lösung gibt positive Ergebnisse für Teilstrings der strings wenn nicht, zB Pos ('ca', 'cat' + 'dog') gibt 1, aber 0 wird benötigt Pos ('td', 'cat' + 'dog') ergibt 3, aber 0 ist benötigt – lkessler

+1

-1 für falsch positive –

+0

Schlechtere Lösung, weil nicht alle Strings concat. Die beste Lösung ist das @ Re0less oben. –