Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 检查值是否在集合中的替代方法_Delphi_Set - Fatal编程技术网

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;