2010-06-07 46 views
8

我有以下代码。它看起来很丑陋,如果该值等于下面的值之一,那么做一些事情。替代检查,值是否在集合中

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中的一个有效集合只接受类型为byte的元素。如果有什么好的替代方案来重构我的原始代码(除了使用案例)?

回答

15

我觉得这样?

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

谢谢,但正如我在我的问题中指出的,我想要另一种选择。因为使用开关...这种逻辑的情况看起来不正常 – stanleyxu2005 2010-06-07 08:34:33

+0

@ stanleyxu2005。这可能是最有效的。另外,当你开始写这样的东西时,如果条件'如果[。]中的值做了bla,否则如果在[..]中有值,你很可能最终不得不添加一个else或者else else条件。做blabla别人做blablabla'。在这种情况下,案件是明显的选择。 – 2010-06-07 17:05:14

+0

经过一天的等待回应,我同意使用switch ... case是最可接受的解决方案。 – stanleyxu2005 2010-06-07 18:32:50

13

如何使用开放数组?

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; 
+1

+1,不错,我喜欢可重用性和清洁度。 – 2010-06-07 09:49:09

1

有较大位集的一类,见Classes.TBits。

尽管它不会轻松地进行常量表达,但在某些其他情况下它可能很有用。

相关问题