Delphi 检查值是否在集合中的替代方法
我有以下代码。它看起来很难看,如果该值等于以下值之一,则执行某些操作Delphi 检查值是否在集合中的替代方法,delphi,set,Delphi,Set,我有以下代码。它看起来很难看,如果该值等于以下值之一,则执行某些操作 var Value: Word; begin Value := 30000; if (Value = 30000) or (Value = 40000) or (Value = 1) then do_something; end; 我想按如下方式重构代码: var Value: Word; begin Value := 30000; if (Value in [1, 30000, 40000]
var
Value: Word;
begin
Value := 30000;
if (Value = 30000) or (Value = 40000) or (Value = 1) then
do_something;
end;
我想按如下方式重构代码:
var
Value: Word;
begin
Value := 30000;
if (Value in [1, 30000, 40000]) then // Does not work
do_something;
end;
但是,重构后的代码不起作用。我假设Delphi中的有效集只接受byte类型的元素。如果有什么好的替代方法来重构我的原始代码(除了用例)?我想是这样的吗
case value of
1, 30000, 40000: do_somthing
end;
使用开放数组怎么样
function ValueIn(Value: Integer; const Values: array of Integer): Boolean;
var
I: Integer;
begin
Result := False;
for I := Low(Values) to High(Values) do
if Value = Values[I] then
begin
Result := True;
Break;
end;
end;
示例(伪代码):
有一个用于较大位集的类,请参见Classes.TBits
虽然它不容易实现常量表达式,但在某些其他情况下它可能很有用。谢谢,但正如我在问题中所指出的,我需要另一种选择。因为使用switch…这种逻辑的情况看起来不是这样的normal@stanleyxu2005. 这可能是最有效的。此外,当你开始写这样的东西时,很有可能你最后不得不在[.]do bla else if value in[.]do bla else if value in[…]do blabla else do bla中添加一个else或else if条件。在这种情况下,案例是显而易见的选择。在等待回复一天后,我同意使用switch…case是最可接受的解决方案。我完全阅读了你问题的最后部分,尽管我仍然认为案例是最好的解决方案,所以我很高兴我们同意。:-)尽管我也喜欢TOndrej的答案。
var
Value: Integer;
begin
Value := ...;
if ValueIn(Value, [30000, 40000, 1]) then
...
end;