2010-06-07 15 views
8

Ich habe den folgenden Code. Es sieht hässlich aus, wenn der Wert einem der folgenden Werte entspricht, dann tue etwas.Alternative zu überprüfen, ob ein Wert in einem Satz ist

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

Ich möchte den Code Refactoring wie folgt:

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

jedoch die Refactoring-Code funktioniert nicht. Ich gehe davon aus, dass eine gültige Menge in Delphi nur Elemente mit dem Typ Byte akzeptiert. Wenn es eine gute Alternative gibt, meinen ursprünglichen Code umzuformen (neben der Groß-/Kleinschreibung)?

Antwort

15

Ich denke so etwas?

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

danke, aber wie ich in meiner Frage bemerkt habe, möchte ich eine andere Alternative. Weil die Verwendung von switch ... case für eine solche Logik nicht normal aussieht – stanleyxu2005

+0

@ stanleyxu2005. Es ist wahrscheinlich das effizienteste. Und außerdem, wenn Sie anfangen, etwas wie dieses zu schreiben, gibt es eine gute Chance, dass Sie am Ende ein anderes oder sogar ein anderes hinzufügen müssen, wenn Bedingung 'wenn Wert in [.] Bla sonst wenn Wert in [..] mach Blabla sonst noch blablabla. In einem solchen Fall ist der Fall die offensichtliche Wahl. –

+0

Nachdem ich einen Tag auf Antworten gewartet habe, stimme ich zu, dass die Verwendung von switch ... case die akzeptabelste Lösung ist. – stanleyxu2005

13

Wie wäre es mit einem offenen 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; 

Beispiel (Pseudocode):

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

+1, Schöne, Ich mag die Wiederverwendbarkeit und Sauberkeit. –

1

Es gibt eine Klasse für größere Bitsets ist, siehe Classes.TBits.

Während es konstante Ausdrücke nicht leicht macht, kann es in bestimmten anderen Fällen nützlich sein.

Verwandte Themen