我有一个使用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),如果有,它是什么?
另一种可能性是将Integer用作位字段:
C_Option1 = 1;
C_Option2 = 2;
C_Option3 = 4;
C_Option4 = 8;
然后使用按位与测试成员身份:
if (Options and C_Option2) > 0 then begin
...
end;
我已经尝试过这种方法,它可以工作,但感觉使用集合会更自然并且更好地利用类型系统(尽管我正在超越所说的类型系统来枚举集合)。
有比枚举底层整数表示更好/更安全的方法来枚举所有可能的集合组合吗?
注:
1. 我知道理论上不能保证一个集合的整数值(尽管我认为如果您不玩枚举编号,实际上是可以保证的)。
2. 可能会有多于四个选项(是的,我知道它呈指数级增长,如果有太多选项,算法可能需要永远执行)。