stanleyxu2005
stanleyxu2005

Reputation: 8231

alternative to check, whether a value is in a set

I have the following code. It looks ugly, if the value equals to one of the following value then do something.

var
  Value: Word;
begin
  Value := 30000;
  if (Value = 30000) or (Value = 40000) or (Value = 1) then
    do_something;
end;

I want to refactor the code as follows:

var
  Value: Word;
begin
  Value := 30000;
  if (Value in [1, 30000, 40000]) then // Does not work
    do_something;
end;

However, the refactored code does not work. I assume that a valid set in Delphi accepts only elements with type byte. If there any good alternative to refactor my original code (besides using case)?

Upvotes: 9

Views: 8773

Answers (3)

Marco van de Voort
Marco van de Voort

Reputation: 26356

There is a class for larger bitsets, see Classes.TBits.

While it won't do constant expressions easily, it can be useful in certain other cases.

Upvotes: 1

Ondrej Kelle
Ondrej Kelle

Reputation: 37211

How about using an open array?

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;

Example (pseudo-code):

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

Upvotes: 14

R-D
R-D

Reputation: 1154

I think something like this?

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

Upvotes: 16

Related Questions