任何人都要评论我们是否应该使用“我”或“II”和“&”或“&&”在我们的LINQ Where()扩展/查询?与LINQ to SQL有什么区别?由此产生的表达树比我星期五下午的大脑还要多。
谢谢,
static void Main(string[] args)
{
var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var q1 = numbers.Where(i => i == 1 | i == 2);
var q2 = numbers.Where(i => i == 1 || i == 2);
var q3 = numbers.Where(i => i == 1 & i < 3);
var q4 = numbers.Where(i => i == 1 && i < 3);
Write(q1);
Write(q2);
Write(q3);
Write(q4);
}
static void Write<T>(IEnumerable<T> t)
{
foreach (var i in t)
Console.Write("{0} ", i);
Console.WriteLine();
}
Results:
1 2
1 2
1
1
答案 0 :(得分:9)
您需要||
/ &&
。
嗯,单管道(|
/ &
)通常用于逐位算术,(以及其他问题)可能会使代码库难以理解; LINQ-to-Objects中的工作(因为bool
的按位仍为定义),但没有通常的短路。但是如果你的数据源是一个数据库(即混合中有一个表达式解析器),你可能会发现它会爆炸。
行;按位可能会产生误导;但是||和&amp;&amp;仍然是表达意图的最合乎逻辑和预期的方式。我为任何困惑道歉。
答案 1 :(得分:4)
有人关注我们是否应该在LINQ Where()扩展/查询中使用
|
或||
以及&
或&&
?
在lambda表达式(例如Linq中经常使用的表达式)中,这些运算符的行为与c#中通常的一样。 |
和&
是逻辑运算符,而||
和&&
是逻辑运算符的短路。如果您需要高效的代码,短路是很好的。如果你想避免分支代码(可能是100%覆盖率的UnitTest),短路是不好的。大多数人一直使用短路,并且分支不会打扰他们,因为他们避免使用具有副作用的表达式,因此当没有评估某些表达式时,他们不会遭受任何不良后果。
以下是通过短路进行有用分支的示例:
if (DatabaseIsAvailable() && QueryDataAndThereAreResults())
{
//do something with Results
}
当DatabaseIsAvailable()为false时,将不会评估QueryDataAndThereAreResults()。
与LINQ to SQL有什么不同?
对Linq to Sql使用哪个并不重要。标点符号将被翻译为T-Sql的AND
和OR
运算符。查询发送到数据库后,SqlServer查询计划优化器将确定是否短路。
答案 2 :(得分:1)
在你的例子中都是一样的。 |运算符的类型为bool重载,与||
相同http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx
我更喜欢使用||因为人们习惯了它,对大多数开发者来说感觉更自然。
答案 3 :(得分:0)
这实际上取决于您的偏好。
一般来说,MOST开发人员坚持||和&amp;&amp;对于所有逻辑OR和AND的尤其是,当他们在代码中处理一堆数字时,就像你一样。这是因为它在视觉上让其他开发者感到困惑。
所以,我的意见是坚持||和&amp;&amp;为你的逻辑工作,只使用|和&amp;用于按位操作。
同样,虽然这只是偏好。