针对多个值测试变量?

时间:2012-01-17 00:53:44

标签: c# if-statement

我记得在这里看到一个关于同样问题的问题,例如:

if( x==null || x==" " || x==" " || x=="\n")...

最终变得长而丑陋的琴弦,但答案并不是很好,我不记得它是什么。

我正处于MySQL教程的中间,在SQL中解决问题的方法是使用关键字“IN”。

WHERE value IN (1 , 22, 35)...

所以我想知道它是否被认为是低效或不好的做法:

object[] BadVals = {null, " ", "  ", "\n"};
if(Array.IndexOf(BadVals, x) != -1)...

3 个答案:

答案 0 :(得分:6)

它在理论上肯定不如直接if测试,但这是一个红色的鲱鱼。真正的问题是:你关心吗?

这个问题的两个方面。

  1. 那么如果它变得更慢呢?如果你不是在一个执行了一百万次的CPU绑定循环上运行它,那么差异纯粹是理论上的。使用任何产品可以获得更多无错误的代码,以便阅读和维护。
  2. 那么如果它更丑陋呢?你会写这么多次吗?当然不是 - 如果你打算多次使用,把它放在一个名字很好的方法中,再也不要再想它了。
  3. 至于LINQ方法,它比你的方法略短,可读性更强:

    if((new[] { null, " ", "  ", "\n" }).Contains(x)) ...
    

    您可能想要编写另一种扩展方法,允许您在操作数位置反转的情况下调用它,例如。

    if(x.In(new[] { null, " ", "  ", "\n" })) ...
    

    判决:如果没有其他更明显的方法来检查这些值,我会使用LINQ超过3个左右的值进行测试。例如,在这种情况下IsNullOrWhiteSpace非常接近)并且没有明显的性能影响。否则,if会被尝试并且为真。

答案 1 :(得分:3)

不一定是不好的做法,但还有其他一些方法。有两种不同的方式:

  1. 对于null / empty字符串,

    String.IsNullOrEmpty(s.Trim());
    
  2. 4.0中的
  3. IsNullOrWhiteSpace

     String.IsNullOrWhitespace(s.Trim()); 
    
  4. 对于像SQL IN这样的运算符:

    if((new[] {" ", "  ", "\n"}).Contains(s))
    {
    }
    

答案 2 :(得分:1)

这些风格问题很少是绝对的,很大程度上取决于正在解决的具体问题,以及组织因素和个人偏好。这就是说,一个备受好评的参考文献(史蒂夫麦克唐纳的代码完成)建议simplify complicated tests with boolean function calls作为降低if语句复杂性的手段。例如,可以用以下内容替换上面的if语句:

if (IsStringFoo(s)) {...}

其他地方定义为

// Returns true if and only if the input string is a Foo
bool IsStringFoo(string s)
{
    return s == "" || s == " " || s == "\n";
    // or use the alternate array syntax here instead if you prefer
}

这不仅向消费者传达逻辑机制,而且可能是这些机制的商业理由,因此可能提高可读性。

使用提出的in语法可能会遇到类似的可读性问题 - 特别是,仍然不清楚为什么正在进行这些特定的测试。后一种方法可能更难以理解,因为“或”以一种方式传递布尔逻辑操作.IndexOf不一定。