替代检查,值是否在集合中

时间:2010-06-07 07:47:58

标签: 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]) then // Does not work
    do_something;
end;

但是,重构的代码不起作用。我假设Delphi中的有效集仅接受类型为byte的元素。如果有任何好的替代方法来重构我的原始代码(除了使用案例)?

3 个答案:

答案 0 :(得分:15)

我觉得这样的事情?

case value of
  1, 30000, 40000: do_somthing
end;

答案 1 :(得分:13)

如何使用开放阵列?

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;

示例(伪代码):

var
  Value: Integer;
begin
  Value := ...;
  if ValueIn(Value, [30000, 40000, 1]) then
    ...
end;

答案 2 :(得分:1)

有一个较大位集的类,请参阅Classes.TBits。

虽然它不会轻易地执行常量表达式,但在某些其他情况下它可能很有用。