Question Meilleur moyen de savoir si une chaîne est dans une liste (sans les génériques)


Je veux faire quelque chose comme ça:

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

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

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

De plus, je pense que créer un StringList pour faire ceci est trop complexe.

Y a-t-il un autre moyen d'y parvenir?

Merci.


26
2017-10-29 12:37


origine


Réponses:


Vous pouvez utiliser AnsiIndexText (const AnsiString AText, tableau de const de chaîne AValues): entier ou MatchStr (const AText: string; const AValues: tableau de chaîne): Boolean;

Quelque chose comme

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

ou

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

AnsiIndexText renvoie le décalage de 0   index de la première chaîne trouvée dans   AValues ​​qui correspond à AText    insensibilité à la casse. Si la chaîne   spécifié par AText n'a pas de   (éventuellement insensible à la casse)   AValues, AnsiIndexText retourne -1.   Les comparaisons sont basées sur le courant   paramètres régionaux du système

MatchStr détermine si l'un des   chaînes dans le tableau AValues ​​correspondent à la   chaîne spécifiée par AText en utilisant un Cas   comparaison sensible. Il retourne vrai   si au moins une des chaînes de la   correspondance de tableau, ou false si aucun des   les chaînes correspondent.

Remarque AnsiIndexText ne tient pas compte de la casse et MatchStr est sensible à la casse, donc je suppose que cela dépend de votre utilisation

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


50
2017-10-29 13:15



Le code de Burkhard fonctionne, mais itère inutilement 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;

7
2017-10-29 13:10



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 comparez MyString avec chaque chaîne dans Strings. Dès que vous en trouvez un, vous pouvez quitter la boucle for.


1
2017-10-29 12:49



Vous pouvez essayer ceci:

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

-4
2017-12-10 05:09