Vous connaissez ce bloc: existe-t-il un moyen de déclarer jeu de chaîne code>? Ou y a-t-il un code similaire que je peux utiliser à la place? La partie importante de ce bloc est
si c en mySet puis showMessage ("existe"); code> Je veux utiliser quelque chose comme ceci sur un ensemble de ficelles.
Merci. P> p>
7 Réponses :
Les ensembles sont implémentés à l'aide de tableaux de bits. Donc non, vous ne pouvez pas avoir un «jeu de chaîne». Utilisez une TStringList à la place, c'est-à-dire:
var mySet: TStringList; S: String; begin S := ...; mySet := TStringList.Create; try mySet.Add('a'); mySet.Add('b'); mySet.Add('c'); if mySet.IndexOf(S) <> -1 Then ShowMessage('Exists'); finally mySet.Free; end; end;
Si vous avez beaucoup de chaînes, il pourrait être préférable d'utiliser la liste triée et d'ignorer les doublons: myset.sorted: = vrai; myset.duplicat: = Dupignores;
Vous pouvez utiliser ceci.
type TAnyEnum = (aeVal1, aeVal2, aeVal3); TEnuns = set of TAnyEnum; TAnyMessages: array [TAnyEnum] of String; const MyMessages: TAnyMessages = ('Exists', 'Something else', 'WTF!?'); var MySet : TEnums; begin MySet = [aeVal1, aeVal2]; If aeVal1 in MySet then ShowMessage(MyMessages[aeVal1]); end;
Pour répondre correctement à la question, le point d'entrée doit être une chaîne et non un type énuméré. -> la question n'est pas respectée
@ Didiercabalé mais un ensemble Delphi doit être basé sur un type ordinal B>. Les chaînes ne sont pas des types ordinaux. Plus vous pouvez obtenir un ensemble de chaînes, c'est ça.
@Fabricioaraujo, cela dépend de l'endroit où vous vous concentrez sur: s'il s'agit d'utiliser ensemble de i>, je conviens que c'est le plus proche. Mais cela ne répond pas à la question fondamentale qui est comment savoir si une chaîne spécifique est dans un ensemble de chaîne i>, et dans ce cas, vous ne pouvez pas utiliser la construction de Pascal "Set de"
C'est honte, mais Delphi n'a toujours pas encore de structures de données très élémentaires, comme des ensembles.
Suggestion de "Fabricio Araujo" est très limitée dans l'usage - vous devez connaître toutes les chaînes possibles, il est donc inutile de les lire de quelque part. Il est également impossible d'avoir plus de 256 articles dans un tel "ensemble de chaînes la plus alternatif". Remy Lebeau a suggéré d'utiliser Tstringlist à cette fin, mais il est absolument inefficace lorsque vous avez de grands ensembles. Dans les versions modernes de Delphi, il est possible d'utiliser TDictionary pour garder un ensemble non ordonné de n'importe quoi, y compris des chaînes: il est sensible à la casse. Si vous avez besoin d'une mise en oeuvre insensible de cas, vous pouvez effectuer toutes les chaînes mises en couches avant de mettre / regarder ensuite dans le jeu (utilisez une fonction ansilowercase pour cela). P> P>
La plupart du temps, j'utilise un dictionnaire dans .net est pour les cas où ma solution suffirait.
"Donc, il est inutile lorsque vous les lisez de quelque part". Non, n'est pas inutile. Au lieu d'utiliser une constante de réseau, utilisez une matrice variable b> et remplissez-la de la source souhaitée.
Le système RTL l'utiliser comme ceci: p> System.strutils CODE> Unité fournit une méthode très intéressante pour cela:
Cela crée un tableau de [0..5] de la chaîne à la compilation et la transmet à la fonction. Avantages: c'est 1 ligne. C'est bien dans des situations très limitées. PAR EXEMPLE. Cette chaîne est-elle autorisée dans ce champ? Inconvénients: Si vous utilisez ce double doublure, vous avez induit un bug. Le responsable de votre code peut changer cela dans une seule instance et manquer l'autre. En outre, la RTL effectue une recherche linéaire inefficace de ce réseau à l'aide de la chaîne Comparer. POS (Slangues, 'FR-FR, EN-GB, DE-DE, IT-IT, FR-CH, ES-ES')> 0 serait plus rapide - et toujours pas une bonne idée.
@Guygordon 1. La fonction MatchText est définie comme suit: Fonction Matchtext (const Atext: chaîne; const Avalues: tableau de chaîne): Boolean; -> L'argument de tableau peut faire référence à une référence de const, comme "Const Cstrings: tableau de chaîne = ['FR-FR', 'EN-GB', 'DE-DE', 'IT-IT', 'FR-CH ',' es-es '] ". -> Le tableau est maintenant référencé dans un seul endroit, c'est-à-dire ce que vous vouliez. 2. Votre proposition d'utilisation du "POS" donne un problème incorrect, car il accepte à tort des cordes comme "FR" ou "GB".
Oups. Tu as raison, merci. Vous devez mettre des délimiteurs autour des substrings et autour de la chaîne de recherche. Et c'est sensible à la casse. Comme je l'ai dit, pas une bonne idée.
Fabricio Araujo a posté la meilleure réponse à la question initiale. pour la question "est Montmabbr dans l'ensemble des abréviations autorisées des noms de mois?" Votre code pourrait donc lire Pour la mise en œuvre, la réponse générale la plus simple consiste à utiliser une TStringList Trié dans Delphi 7 (comme la question est étiquetée). P>
Mais si vous posez cette question, vous devriez aussi vous demander
"Est-ce que je
Les chances sont votre prochaine question est "bien alors, quel mois
Case GetMonThNumber (STR) de
0: // Erreur: STR n'est pas un nom de mois ou une abréviation
1: // etc. Code> p>
fonction Matchstr détermine si l'une des chaînes de la matrice avalue correspond à la chaîne spécifiée par ATTEXT à l'aide d'une comparaison forte> Sensible>. Il revient vrai si au moins une des chaînes de la correspondance de la matrice, ou FALSE si aucune des chaînes correspondent. P>
pour une correspondance insensible à la case
Une autre option consiste à déclarer une nouvelle "chaîne" et à utiliser une aide d'enregistrement pour implémenter l'opérateur "IN" sur celui-ci:
USES System.SysUtils, System.StrUtils; TYPE TextString = RECORD PRIVATE STR : STRING; PUBLIC CLASS OPERATOR Implicit(CONST S : STRING) : TextString; INLINE; CLASS OPERATOR Implicit(CONST S : TextString) : STRING; INLINE; END; { TextString } CLASS OPERATOR TextString.Implicit(CONST S : STRING) : TextString; BEGIN Result.STR:=S END; CLASS OPERATOR TextString.Implicit(CONST S : TextString) : STRING; BEGIN Result:=S.STR END; TYPE TStringHelper = RECORD HELPER FOR TextString CLASS OPERATOR In(CONST T : TextString ; CONST ARR : ARRAY OF STRING) : BOOLEAN; FUNCTION IsEmpty : BOOLEAN; END; { TStringHelper } CLASS OPERATOR TStringHelper.In(CONST T : TextString ; CONST ARR : ARRAY OF STRING) : BOOLEAN; BEGIN Result:=MatchText(T.STR,ARR) END; FUNCTION TStringHelper.IsEmpty : BOOLEAN; BEGIN Result:=STR.IsEmpty END; VAR S : TextString; T : STRING; begin try REPEAT WRITE('Enter an animal name: '); READLN(T); S:=T; IF S.IsEmpty THEN EXIT; IF S IN ['Bird','Lion','Monkey'] THEN WRITELN('You got it!') ELSE WRITELN('Nope - Try Again...') UNTIL FALSE except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.