2010-06-30 17 views
5

Bu blokta aşina:Dize Seti?

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

Set Of STRING bildirmek için herhangi bir yolu var mı? veya bunun yerine kullanabileceğim benzer bir kod var mı? Bu bloğun önemli kısmı If C In mySet Then ShowMessage('Exists');'dur. Bir dizi dizi hakkında böyle bir şey kullanmak istiyorum.
Teşekkürler.

cevap

7

Bunu kullanabilirsiniz.

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

Teşekkür ederim, Faydalı! – Armin

10

Takımlar bit dizileri kullanılarak uygulanır. Yani hayır, 'string dizisi' olamaz. Bunun yerine, bir TStringList kullanın, örneğin:

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

Çok fazla diziniz varsa, sıralı liste kullanmak ve kopyaları yoksaymak daha iyi olabilir: mySet.Sorted: = True; mySet.Duplicates: = dupIgnores; – Harriv

3

Bu utanç verici, ancak Delphi kümeler gibi hala çok temel veri yapılarına sahip değil. "Fabricio Araujo" nın önerisi kullanımda çok sınırlıdır - olası tüm dizeleri bilmeniz gerekir, bu yüzden onları bir yerden okurken işe yaramaz. Aynı zamanda "hemen hemen dizgi dizisi" nde 256 öğeden daha fazlasına sahip olmak imkansızdır. Remy Lebeau, bu amaçla TStringList'i kullanmayı önerdi, ancak büyük takımlarınız olduğunda kesinlikle verimsiz. Delphi modern versiyonları yılında dizeleri dahil hiçbir şeyden sırasız tutmak isteyen TDictionary kullanmak mümkündür: O harfe duyarlıdır

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; 

. Büyük/küçük harf duyarlı olmayan bir uygulamaya ihtiyaç duyarsanız, tüm dizeleri set/bakmadan önce set halinde küçültebilirsiniz (bunun için AnsiLowerCase işlevini kullanın).

+0

Çoğu zaman .NET'de bir Sözlük kullanıyorum, çözümümün yeterli olduğu durumlar içindir. –

+0

"bu yüzden onları bir yerden okuduğunuzda yararsızdır". Hayır, işe yaramıyor. Bir dizi sabiti kullanmak yerine, bir ** ** değişken dizisini kullanın ve istediğiniz kaynaktan doldurun. –