альтернатива проверке, является ли значение в наборе

У меня есть следующий код. Это выглядит ужасным, если значение равняется одному из следующего значения, затем делают что-то.

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 принимает только элементы с байтом типа. Если там какая-либо хорошая альтернатива для рефакторинга моего исходного кода (помимо использования случая)?

8
задан PeeHaa 3 November 2013 в 18:03
поделиться

3 ответа

Думаю, что-то вроде этого?

case value of
  1, 30000, 40000: do_somthing
end;
15
ответ дан 5 December 2019 в 05:44
поделиться

Как насчет использования открытого массива?

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;
13
ответ дан 5 December 2019 в 05:44
поделиться

Существует класс для больших битовых наборов, см. Classes.TBits.

Несмотря на то, что он нелегко справляется с постоянными выражениями, он может быть полезен в некоторых других случаях.

1
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: