【发布时间】:2010-11-04 00:06:27
【问题描述】:
我在 Delphi 中有一个包含许多不同选项的计算算法,我需要尝试每种选项组合以找到最佳解决方案。
TMyOption = (option1, option2, option3, option4);
TMyOptions = set of TMyOption;
我想知道使用整数循环来枚举它们:
for EnumerationInteger := 0 to 15 do begin
Options := TMyOptions(EnumerationInteger);
end;
这不会编译。我想知道是否有任何相当简单的方法可以从 Integer 转换为 Set(网络上的大多数问题都尝试另一种方式,从 Set 转换为 Integer),如果有,它是什么?
另一种可能性是将整数用作位域:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
然后使用按位与测试成员资格:
if (Options and C_Option2) > 0 then begin
...
end;
我已经尝试过了,它确实有效,但感觉使用集合会更自然,并且更好地使用类型系统(即使我要超出上述类型系统来枚举集合)。
有没有比枚举底层整数表示更好/更安全的方法来枚举所有可能的集合组合?
注意事项:
- 我知道理论上不能保证集合的整数值(尽管如果您不使用枚举编号,我怀疑它们在实践中是可行的)。
- 可能有四个以上的选项(是的,我知道它会呈指数增长,如果选项太多,算法可能会永远占用)。
【问题讨论】: