当数组被枚举类型索引时,如何找到数组中项的索引?

时间:2014-11-01 19:42:21

标签: arrays delphi enums

在我的代码中,我有以下类型和数组 我得到一个字符串,我想检查它是否存在于数组中,从索引我需要从TProgramModule获取一个值

示例:我有文本Job,需要找到它在数组ModuleName中有索引3然后我需要检查TProgramModule并获取modJobsystem,因为它是第3项

希望能解释我在寻找什么 - 欢迎任何其他方式获得结果

type
  TProgramModule = (
                    modBlank,
                    modMeter,
                    modFinance,
                    modJobsystem,
                    modTimesheet,
                    modTaskmanagement,
                    modHomeContents,
                    modDiary,
                    modCases,
                    modDocuments,
                    modContacts
                   );

const
  ModuleName: array[TProgramModule] of string = (
                                                  'Blank',
                                                  'Måleraflæsning',
                                                  'Konti',
                                                  'Job',
                                                  'Timesedler',
                                                  'Opgaver',
                                                  'Indbo',
                                                  'Dagbog',
                                                  'Sagsstyring',
                                                  'Dokumentstyring',
                                                  'Kontaktpersoner'
                                                );

2 个答案:

答案 0 :(得分:4)

这可以通过循环完成:

var
  i: Integer;
  Find: string;
  Module: TProgramModule;
begin
  Find := 'Job';
  for i := Low(ModuleName) to High(ModuleName) do
    if ModuleName[i] = Find then
    begin
      Module := i;
      Break;
    end;
end;

您应该将此转换为一个函数,该函数接受要作为字符串搜索的值并返回正确的TProgramModule。如果在ModuleName中找不到字符串,则该问题将成为函数返回的内容。

function FindProgramModule(const Name: string): TProgramModule;
var
  i: TProgramModule;
begin
  for I := Low(ModuleName) to High(ModuleName) do
    if ModuleName[i] = Name then
      Exit(i);    
  Exit(modBlank);  // Not found - return whatever default value here
end;

对于不支持Exit()的旧版Delphi:

function FindProgramModule(const Name: string): TProgramModule;
var
  i: TProgramModule;
begin
  Result := modBlank;   // Whatever default value goes here
  for I := Low(ModuleName) to High(ModuleName) do
    if ModuleName[i] = Name then
    begin
      Result := i;    
      Break;
    end;
end;

答案 1 :(得分:2)

我会这样写:

function FindProgramModule(const Name: string): TProgramModule;
begin
  for Result := Low(ModuleName) to High(ModuleName) do
    if ModuleName[Result] = Name then
      Exit;
  Raise EModuleNotFound.CreateFmt(
    'Module not recognised: %s',
    [Name]
  );
end;

如果您不想引发异常,则返回sentinel枚举以指示模块未被识别。