2012-10-18 153 views
4

給出下面的聲明,有沒有辦法從一個字符串值(例如'一')檢索枚舉值(例如jt_one)?從字符串枚舉

type 
TJOBTYPEENUM =(jt_one, jt_two, jt_three); 


CONST JOBTYPEStrings : ARRAY [jt_one..jt_three] OF STRING = 
    ('one','two','three'); 

或者我需要使用if語句的嵌套集創建我自己的函數嗎?

注:我不是在尋找字符串 「jt_one」

+5

這只是我還是難以閱讀這些ALLCAPSIDENTIFIERS?德爾福公約會規定'TJobType =(jtOne,jtTwo,jtThree);' –

+1

對不起,但我不確定每個人都遵循約定來開球,特別是我們剛剛學習的新朋友。也許你可以留下一些理解空間? –

+1

我不記得對你不禮貌。但是基於文本的交流可能有點棘手,有時候可能會讓人覺得有人在他不真實的時候很粗魯。 –

回答

10
function EnumFromString(const str: string): TJOBTYPEENUM; 
begin 
    for Result := low(Result) to high(Result) do 
    if JOBTYPEStrings[Result]=str then 
     exit; 
    raise Exception.CreateFmt('Enum %s not found', [str]); 
end; 

在實際的代碼,你想使用自己的異常類。如果您想允許不區分大小寫的匹配,請使用SameText比較字符串。

+0

作爲'for'變量的結果?這是整潔.... ;-) –

+0

@FabricioAraujo這是一個非常有名的成語。我認爲這幾乎是線性搜索的典型Delphi實現。 –

+1

我剛剛發現它很好奇,因爲我傾向於像Andreas的樣本那樣編寫代碼。查看文檔,它是完全有效的 - 因爲循環被「Exit」語句中斷(如果循環完成,「Result」的值未定義)。 –

7
function GetJobType(const S: string): TJOBTYPEENUM; 
var 
    i: integer; 
begin 
    for i := ord(low(TJOBTYPEENUM)) to ord(high(TJOBTYPEENUM)) do 
    if JOBTYPEStrings[TJOBTYPEENUM(i)] = S then 
     Exit(TJOBTYPEENUM(i)); 
    raise Exception.CreateFmt('Invalid job type: %s', [S]); 
end; 

或者,整潔,

function GetJobType(const S: string): TJOBTYPEENUM; 
var 
    i: TJOBTYPEENUM; 
begin 
    for i := low(TJOBTYPEENUM) to high(TJOBTYPEENUM) do 
    if JOBTYPEStrings[i] = S then 
     Exit(i); 
    raise Exception.CreateFmt('Invalid job type: %s', [S]); 
end; 
+0

這個函數無法設置返回值,以防S不在數組中 –

+0

@David:好點。 –

+0

這樣比較好。鑄造的第一個版本很差。我會堅持你的第二個版本,只是擺脫與演員陣容。 –