給出下面的聲明,有沒有辦法從一個字符串值(例如'一')檢索枚舉值(例如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」
給出下面的聲明,有沒有辦法從一個字符串值(例如'一')檢索枚舉值(例如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」
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
比較字符串。
作爲'for'變量的結果?這是整潔.... ;-) –
@FabricioAraujo這是一個非常有名的成語。我認爲這幾乎是線性搜索的典型Delphi實現。 –
我剛剛發現它很好奇,因爲我傾向於像Andreas的樣本那樣編寫代碼。查看文檔,它是完全有效的 - 因爲循環被「Exit」語句中斷(如果循環完成,「Result」的值未定義)。 –
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;
這個函數無法設置返回值,以防S不在數組中 –
@David:好點。 –
這樣比較好。鑄造的第一個版本很差。我會堅持你的第二個版本,只是擺脫與演員陣容。 –
這只是我還是難以閱讀這些ALLCAPSIDENTIFIERS?德爾福公約會規定'TJobType =(jtOne,jtTwo,jtThree);' –
對不起,但我不確定每個人都遵循約定來開球,特別是我們剛剛學習的新朋友。也許你可以留下一些理解空間? –
我不記得對你不禮貌。但是基於文本的交流可能有點棘手,有時候可能會讓人覺得有人在他不真實的時候很粗魯。 –