2010-06-30 12 views
5

Vous connaissez ce bloc:Jeu de cordes?

Var 
    mySet: Set Of Char; 
    C: Char; 
begin 
    mySet := ['a', 'b', 'c']; 
    If C In mySet Then ShowMessage('Exists'); 
end; 

Est-il possible de déclarer Set Of STRING? ou y at-il un code similaire que je peux utiliser à la place? La partie importante de ce bloc est If C In mySet Then ShowMessage('Exists'); Je veux utiliser quelque chose comme ça à propos d'un ensemble de chaîne.
Merci.

Répondre

7

Vous pouvez utiliser cela.

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; 
+0

Merci, Utile !! – Armin

10

Les ensembles sont implémentés en utilisant des matrices de bits. Donc non, vous ne pouvez pas avoir un 'ensemble de chaînes'. Utilisez un TStringList à la place, à savoir:

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; 
+3

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: = True; mySet.Duplicates: = dupIgnores; – Harriv

3

Il est dommage, mais Delphi ne disposent toujours pas même des structures de données très basiques, comme des ensembles. Suggestion de "Fabricio Araujo" est très limitée dans l'utilisation - 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 éléments dans un tel "ensemble de chaînes". Remy Lebeau a suggéré d'utiliser TStringList à cette fin, mais il est absolument inefficace quand vous avez de grands ensembles. Dans les versions modernes de Delphi il est possible d'utiliser TDictionary garder ensemble non ordonné de quoi que ce soit, y compris les chaînes:

procedure TForm6.FormCreate(Sender: TObject); 
type 
    TEmpty = record end; 
var 
    MySet: TDictionary<String, TEmpty>; 
    Dummy: TEmpty; 
begin 
    MySet := TDictionary<String, TEmpty>.Create; 
    try 
    MySet.Add('Str1', Dummy); 
    MySet.Add('Str2', Dummy); 
    MySet.Add('Str3', Dummy); 
    if MySet.TryGetValue('Str2', Dummy) then 
     ShowMessage('Exists');; 
    finally 
    MySet.Free; 
    end; 
end; 

Il est sensible à la casse. Si vous avez besoin d'une implémentation insensible à la casse, vous pouvez mettre toutes les chaînes en minuscules avant de mettre/look alors dans set (utilisez la fonction AnsiLowerCase pour cela).

+0

La plupart du temps, j'utilise un dictionnaire dans .NET pour les cas où ma solution suffirait. –

+0

"donc ça ne sert à rien de les lire de quelque part". Non, n'est pas inutile. Au lieu d'utiliser une constante tableau, utilisez un tableau ** variable ** et remplissez-le à partir de la source que vous voulez. –