2010-06-30 4 views
5

Sei familiarità con questo blocco:Set di spago?

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

Esiste un modo per dichiarare Set Of STRING? o c'è un codice simile che posso usare invece? La parte importante di questo blocco è If C In mySet Then ShowMessage('Exists'); Voglio usare qualcosa di simile su un set di stringhe.
Grazie.

risposta

7

È possibile utilizzare questo.

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

Grazie, utile !! – Armin

10

Gli insiemi vengono implementati utilizzando matrici di bit. Quindi no, non puoi avere un "set di corde". Utilizzare invece TStringList, ad esempio:

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

Se si dispone di un sacco di stringhe, potrebbe essere meglio usare elenco ordinato e ignorare i duplicati: mySet.Sorted: = True; mySet.Duplicates: = dupIgnores; – Harriv

3

È un peccato, ma Delphi non ha ancora strutture di dati molto semplici, come i set. Il suggerimento di "Fabricio Araujo" è molto limitato nell'uso: devi conoscere tutte le possibili stringhe, quindi è inutile quando le leggi da qualche parte. È anche impossibile avere più di 256 elementi in tale "insieme di stringhe". Remy Lebeau ha suggerito di usare TStringList per questo scopo, ma è assolutamente inefficiente quando si hanno grandi set. Nelle versioni moderne di Delphi è possibile utilizzare TDictionary per tenere insieme non ordinato di qualsiasi cosa, tra cui le stringhe:

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; 

Si tratta di maiuscole e minuscole. Se è necessaria un'implementazione senza distinzione tra maiuscole e minuscole, è possibile rendere tutte le stringhe in minuscolo prima di mettere/guardare nel set (utilizzare la funzione AnsiLowerCase per questo).

+0

La maggior parte del tempo che uso un dizionario in .NET è per i casi in cui la mia soluzione sarebbe sufficiente. –

+0

"quindi è inutile quando li leggi da qualche parte". No, non è inutile. Invece di usare una costante di array, usa una matrice ** variabile ** e riempila dalla fonte che vuoi. –