我记得在这里看到一个关于同样问题的问题,例如:
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 :(得分:6)
它在理论上肯定不如直接if
测试,但这是一个红色的鲱鱼。真正的问题是:你关心吗?
这个问题的两个方面。
至于LINQ方法,它比你的方法略短,可读性更强:
if((new[] { null, " ", " ", "\n" }).Contains(x)) ...
您可能想要编写另一种扩展方法,允许您在操作数位置反转的情况下调用它,例如。
if(x.In(new[] { null, " ", " ", "\n" })) ...
判决:如果没有其他更明显的方法来检查这些值,我会使用LINQ超过3个左右的值进行测试。例如,在这种情况下IsNullOrWhiteSpace
非常接近)并且没有明显的性能影响。否则,if
会被尝试并且为真。
答案 1 :(得分:3)
不一定是不好的做法,但还有其他一些方法。有两种不同的方式:
对于null / empty字符串,
String.IsNullOrEmpty(s.Trim());
String.IsNullOrWhitespace(s.Trim());
对于像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不一定。