2008-10-29 14 views
26

Je veux faire quelque chose comme ceci:La meilleure façon de trouver si une chaîne est dans une liste (sans génériques)

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

Cela ne peut pas être utilisé avec des cordes et je ne veux pas faire quelque chose comme ceci:

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

Aussi je pense que créer un StringList pour faire ceci est trop complexe.

Existe-t-il un autre moyen d'y parvenir?

Merci.

Répondre

50

Vous pouvez utiliser AnsiIndexText (const AnsiString ATaille, un tableau const de aLes valeurs string): entier ou matchstr (const ATaille: string; const a Valeurs: tableau de chaînes): Boolean;

Quelque chose comme

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

ou

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

AnsiIndexText renvoie l'index 0 offset de la première chaîne qu'il trouve dans aLes valeurs qui correspond ATaille insensible à la casse. Si la chaîne spécifiée par AText n'a pas de correspondance (peut-être insensible à la casse) dans AValues, AnsiIndexText renvoie -1. Les comparaisons sont basées sur les paramètres régionaux actuels du système .

matchstr détermine si l'une des chaînes de l' aLes valeurs du tableau correspondent à la chaîne spécifiée par ATaille en utilisant un cas comparaison sensible. Il renvoie true si au moins l'une des chaînes du groupe correspond, ou false si aucune des chaînes ne correspond.

Remarque AnsiIndexText a indépendamment de la casse et matchstr est le cas donc je suppose sensible que cela dépend de votre utilisation

EDIT: 03/09/2011: Juste trouvé cette réponse et a pensé que je voudrais ajouter une note que, dans Delphi 2010, il y a aussi une fonction MatchText qui est la même que MatchStr mais insensible à la casse.- Larry

+0

En fait il y en a un meilleur, juste cherché un peu dans le StrUtils.pas et trouvé le MatchStr qui retourne un booléen: Résultat: = MatchStr ('Hi' , ['foo', 'Bar']); Veuillez l'ajouter à votre réponse –

+0

MatchStr et MatchText sont également disponibles dans Delphi 2007. –

+0

tout équivalent pour Delphi 7? – CyprUS

1

Voici une fonction qui fait le travail:

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; 

En fait, vous ne comparez MaChaîne à chaque chaîne dans les chaînes. Dès que vous en trouvez un correspondant, vous pouvez quitter la boucle for.

+0

Cela fonctionne, s'il vous plaît mettre à jour votre code avec Delphi un: fonction StringInArray (Valeur: string; cordes: tableau de chaînes): Boolean; var I: Entier; début Résultat: = Faux; pour I: = Low (Strings) à High (Strings) do Résultat: = Résultat ou (Valeur = Chaînes [I]); fin; –

+0

C'est dur d'être un n00b et de ne pas pouvoir éditer des trucs :( –

7

Le code de Burkhard fonctionne, mais itère sans nécessité sur la liste même si une correspondance est trouvée.

meilleure approche:

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

Vous pouvez essayer ceci:

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

Désolé mais votre solution donne des résultats positifs pour les sous-chaînes de la par exemple Pos ('ca', 'cat' + 'dog') donne 1, mais 0 est nécessaire Pos ('td', 'cat' + 'dog') donne 3, mais 0 est – lkessler

+1

-1 pour les faux positifs –

+0

Pire solution, car il n'est pas nécessaire de concaténer toutes les chaînes La meilleure solution est la @ Re0sless ci-dessus. –