我怎么知道集合中特定值的索引

时间:2015-10-13 18:52:00

标签: delphi

我有这些代码:

    TAPPUGroup = (APP_UG_USERS, APP_UG_SUPER_USERS, APP_UG_ADMINS);
    TAPPUGroups = set of TAPPUGroup;

    TAppUser = record
        UID: integer;
        UName: string;
        UGroup: TAPPUGROUPS;

    end;

...
LoggedUser: TAppUser;

我使用include将组添加到LoggedUser.UGroup,现在我如何知道TAPPUGroup中特定值的索引,例如,如果在LoggedUser.UGroup中包含APP_UG_SUPER_USERS,我如何在TAPPUGroup中获取它的索引?

示例:如果LoggedUser.UGroup = APP_UG_SUPER_USERS,那么我想返回1,如果LoggedUser.UGroup = APP_UG_ADMINS我想要返回2,依此类推。

2 个答案:

答案 0 :(得分:2)

如果你确实想要枚举中给定枚举项的索引,那么你只需要使用Ord()。

换句话说,您可以使用枚举名称,因为它是一个函数:

AGroup := TAPPUGroup(1);

无论如何,Ord()是在连续的枚举声明中找到给定枚举值(如APP_UG_USERS)的索引的方法。要确定特定集合实例是否包含给定的集合元素,请使用"如果xxx在..."构建雷米表演,例如

if APP_UG_USERS in MySet then  ...

你也可以这样做

var 
  AValue : TAPPUGroup;
  MySet : TAPPUGroups ;

for AValue:= Low(TAPPUGroup) to High(TAPPUGroup) do
  if AValue in MySet then ...

答案 1 :(得分:2)

您不需要索引。要知道Set中是否存在值,请改用in运算符:

if APP_UG_SUPER_USERS in LoggedUser.UGroup then