2012-01-17 85 views
4

我记得在这里看到关于该同样的问题,那里的东西,如:针对多个值测试变量?

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)... 
+0

这有效,但我会使用LINQ来代替。 – linuxuser27 2012-01-17 01:00:30

+0

@ linuxuser27,我一直在想:我知道LINQ让所有事情都变得更容易输入,但它是否更有效? – mowwwalker 2012-01-17 01:01:51

+0

“switch”语句非常有效且可读。 – 2012-01-17 01:04:42

回答

6

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

这个问题有两个方面。

  1. 那么如果它变慢呢?如果你没有在一个执行一百万次的CPU绑定循环上运行它,那么这种差别纯粹是理论上的。使用任何提供更多无错代码的方式,这些代码都是阅读和维护的乐趣。
  2. 那么,如果它更丑?你会写这么多次吗?当然不是 - 如果你打算使用很多次,把它放在一个命名好的方法中,不要再考虑它。

对于LINQ的方法,这比略短,有点更具可读性你有什么:

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

你倒是可能需要另写扩展方法,可以让你与调用此操作数位置颠倒了,例如

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

判决:我倒是与LINQ去超过3个左右的值再次进行测试,前提是没有其他检查这些值(更明显的方式例如,在这种情况下IsNullOrWhiteSpace是非常接近)并且没有明显的性能影响。否则,if已尝试并且为true。

+0

LINQ是更简洁的代码。如果您有大量值要检查,请使用更适合的列表。 – 2015-03-23 07:15:50

3

不一定是不好的做法,但也有一些其他的方式。一对夫妇不同的方式是:

  1. 对空/空字符串,

    String.IsNullOrEmpty(s.Trim()); 
    
  2. IsNullOrWhiteSpace在4.0:

    String.IsNullOrWhitespace(s.Trim()); 
    
  3. 像SQL IN操作:

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

不幸的是,当's'为空时,这会爆炸。我使用一个轻微的变体:if((s ??“”“).Trim()==”“){/ *”empty“* /}' – 2012-01-17 01:10:45

+0

@pst,更好的答案更好的方法(4.0)。 – 2012-01-17 01:16:50

1

这些风格问题很少是绝对的,很大程度上取决于正在解决的具体问题,以及组织因素和个人喜好。这就是说,一个广受好评的参考文献(史蒂夫麦克唐奈的代码完整版)建议simplify complicated tests with boolean function calls作为降低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建议的语法可能会遇到类似的可读性问题 - 特别是,仍然不清楚为什么这些特定的测试正在完成。后一种方法可能更难以理解,因为“或”以Array.IndexOf方式传递布尔逻辑操作并不一定。