Meilleure façon de savoir si une chaîne est dans une liste (sans génériques)

StackOverflow https://stackoverflow.com/questions/246623

  •  05-07-2019
  •  | 
  •  

Question

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 une liste de chaînes pour faire cela est trop complexe.

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

Merci.

Était-ce utile?

La solution

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

Quelque chose comme

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

ou

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

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

     

MatchStr détermine si l'un des   les chaînes dans le tableau AValues ??correspondent à la   chaîne spécifiée par AText à l'aide d'un casse   comparaison sensible . Ça retourne vrai   si au moins une des chaînes du   match de tableau, ou faux si aucun des   les chaînes correspondent.

Notez que AnsiIndexText n'a pas de distinction de casse et que MatchStr est sensible à la casse, donc je suppose que cela dépend de votre utilisation

EDIT: 2011-09-3 : Cette réponse vient d'être trouvée et j'ai pensé ajouter une note indiquant que, dans Delphi 2010, il existe également une fonction MatchText qui est la Identique à MatchStr mais pas à la casse. - Larry

Autres conseils

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;

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 une, vous pouvez sortir de la boucle for.

Vous pouvez essayer ceci:

Result := Pos(MyString, string1+string2+string3+string4) > 0
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top