2015-10-08 46 views
1

有以下枚舉:集合類型是否適合循環迭代?

TDays = (tdSunday, tdMonday, tdTuesday, tdWednesday, tdThursday, tdFriday, tdSaturday); 

而下面的組枚舉:

TChoosenDays = set of TDays; 

現在,定義以下數組:

var 
    ArrayStringDaysAcronym : array [TDays] of String = ('SD', 'MD', 'TU', 'WE', 'TH', 'FR', 'ST'); 

假設我已經聲明爲一個變量:

var 
    Foo: TChoosenDays; 
begin 
    Foo:= [tdSunday, tdMonday, tdTuesday]; 

如何迭代集合中的所有成員?

注:以下不編譯,我知道我可以使用數組而不是「set」,是唯一的方法嗎?

function ConcatAcronyms: String; 
var 
    Item: TDays; 
begin 
    Result:= ''; 
    for Item:= Low(Foo) to High(Foo) do 
    begin 
    Result:= Result + '; '+ ArrayStringDaysAcronym[Item]; 
    end; 
end;  
+2

我不確定關於Delphi 6,但在現代版本中,循環有可能以這種方式:var D:TDay;在Foo開始D開始SmFnc(D)... end;結束;' –

+0

@ asd-tm謝謝,但我被困在這個舊版本 – EProgrammerNotFound

+0

@ asd-tm:自從Pascal第一次定義iirc以來,「if元素in []」構造已經存在。爲什麼是Wirth。 – MartynA

回答

3

是的。由於您使用的是D6,因此您可以這樣做:

function ConcatAcronyms: String; 
var 
    Item: TDays; 
begin 
    Result:= ''; 
    for Item:= Low(TDays) to High(TDays) do 
    begin 
    if Item in Foo then begin 
     if Result <> '' then 
     Result := Result + ';' // assuming you don't want Result to start with a ';' 
     Result:= Result + ArrayStringDaysAcronym[Item]; 
    end; 
    end; 
end; 
+0

不錯,但實際上我希望以';'開頭。 – EProgrammerNotFound

+0

由編輯在這裏失望 –

+0

所以,我,雖然我沒有太多看到相關性! ;-)我認爲這是違反DRY的錯誤。而且我也認爲我編輯時的變體在我們穿越時會出現劃痕,實際上比你們兩個都要乾淨。 –