Meilleure façon de savoir si une chaîne est dans une liste (sans génériques)
-
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.
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