2010-06-30 25 views
5

Usted está familiarizado con este bloque:Juego de cuerdas?

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

¿Hay alguna manera de declarar Set Of STRING? o hay un código similar que puedo usar en su lugar? La parte importante de este bloque es If C In mySet Then ShowMessage('Exists');. Quiero usar algo como esto sobre un conjunto de cuerdas.
Gracias.

Respuesta

7

Puede hacer uso de esto.

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

Gracias, ¡¡¡Útil !! – Armin

10

Los conjuntos se implementan usando matrices de bits. Entonces no, no puedes tener un 'conjunto de cuerdas'. Use una TStringList en su lugar, es decir:

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 tiene muchas cadenas, podría ser mejor utilizar la lista ordenada e ignorar los duplicados: mySet.Sorted: = True; mySet.Duplicates: = dupIgnores; – Harriv

3

Es lástima, pero Delphi todavía no tienen estructuras de datos, incluso muy básicas, como conjuntos. La sugerencia de "Fabricio Araujo" tiene un uso muy limitado: debe conocer todas las cadenas posibles, de modo que es inútil cuando las lea desde algún lugar. También es imposible tener más de 256 elementos en ese "casi conjunto de cuerdas". Remy Lebeau sugirió usar TStringList para ese propósito, pero es absolutamente ineficiente cuando tienes grandes conjuntos. En las versiones modernas de Delphi es posible utilizar TDictionary para mantener conjunto desordenado de cualquier cosa, incluyendo cadenas:

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; 

Es mayúsculas y minúsculas. Si necesita una implementación que no distinga entre mayúsculas y minúsculas, puede hacer que todas las cadenas estén en minúscula antes de poner/buscar y establecer en el conjunto (use la función AnsiLowerCase para eso).

+0

La mayor parte del tiempo que uso un diccionario en .NET es para casos en los que mi solución sería suficiente. –

+0

"así que es inútil cuando los lees desde algún lado". No, no es inútil. En lugar de usar una constante de matriz, use una matriz ** variable ** y llénela de la fuente que desee. –