2010-06-07 12 views
8

Tengo el siguiente código. Se ve feo, si el valor es igual a uno del siguiente valor, entonces haz algo.alternativa para verificar, si un valor está en un conjunto

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

Quiero refactorizar el código de la siguiente manera:

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

Sin embargo, el código refactorizado no funciona. Supongo que un conjunto válido en Delphi solo acepta elementos con tipo byte. ¿Hay alguna buena alternativa para refactorizar mi código original (además de usar el estuche)?

Respuesta

15

Creo que algo como esto?

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

gracias, pero como he señalado en mi pregunta, quiero otra alternativa. Debido a que el uso del interruptor ... caso de una lógica así no parece normal – stanleyxu2005

+0

@ stanleyxu2005. Probablemente sea el más eficiente. Y, además, cuando empiezas a escribir cosas como esta, hay una buena posibilidad de que acabes teniendo que añadir un else o incluso una condición else if 'if value in [.] Do bla else else if value in [..] do blabla else do blablabla'. En tal caso, el caso es la elección obvia. –

+0

Después de un día esperando respuestas, acepto que usar el interruptor ... caso es la solución más aceptable. – stanleyxu2005

13

¿Qué le parece usar una matriz abierta?

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; 

Ejemplo (pseudo-código):

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

+1, Bonito, me gusta la reutilización y la limpieza. –

1

Hay una clase para bitsets más grandes, ver Classes.TBits.

Si bien no hará expresiones constantes fácilmente, puede ser útil en otros casos.

Cuestiones relacionadas