2010-06-07 16 views
8

Mam następujący kod. Wygląda to paskudnie, jeśli wartość równa się jednej z następujących wartości, a następnie coś zrobić.możliwość sprawdzenia, czy wartość jest w zbiorze

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

chcę byłaby kodu w następujący sposób:

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

Jednak refactored kod nie działa. Zakładam, że poprawny zestaw w Delphi akceptuje tylko elementy z bajtem typu. Jeśli jest jakaś dobra alternatywa dla refaktoryzacji mojego oryginalnego kodu (poza przypadkiem użycia)?

Odpowiedz

15

Myślę, że coś takiego?

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

dziękuję, ale jak zauważyłem w moim pytaniu, chcę innej alternatywy. Ponieważ użycie przełącznika ... przypadek dla takiej logiki nie wygląda normalnie – stanleyxu2005

+0

@ stanleyxu2005. To chyba najbardziej wydajny. A poza tym, kiedy zaczniesz pisać coś takiego, istnieje duża szansa, że ​​będziesz musiał dodać coś innego, a nawet coś innego, jeśli warunek "jeśli wartość w [.] Będzie inna, jeśli wartość w [..] zrobić blabla jeszcze zrobić blablabla'. W takim przypadku sprawa jest oczywistym wyborem. –

+0

Po jednym dniu oczekiwania na odpowiedź, zgadzam się, że użycie switcha ... case jest najbardziej akceptowalnym rozwiązaniem. – stanleyxu2005

13

Co powiesz na używanie otwartej tablicy?

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; 

Przykład (pseudo-kod):

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

+1, niezły, podoba mi się możliwość ponownego użycia i czystość. –

1

Istnieje pewna klasa większych bitsets patrz Classes.TBits.

Podczas gdy nie będzie to robić wyrażeń stałych z łatwością, może być użyteczne w niektórych innych przypadkach.

Powiązane problemy