LINQ Where()单管或双管/&符号

时间:2009-07-31 20:47:52

标签: c# linq linq-to-sql

任何人都要评论我们是否应该使用“我”或“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

4 个答案:

答案 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的ANDOR运算符。查询发送到数据库后,SqlServer查询计划优化器将确定是否短路。

答案 2 :(得分:1)

在你的例子中都是一样的。 |运算符的类型为bool重载,与||

相同

http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx

我更喜欢使用||因为人们习惯了它,对大多数开发者来说感觉更自然。

答案 3 :(得分:0)

这实际上取决于您的偏好。

一般来说,MOST开发人员坚持||和&amp;&amp;对于所有逻辑OR和AND的尤其是,当他们在代码中处理一堆数字时,就像你一样。这是因为它在视觉上让其他开发者感到困惑。

所以,我的意见是坚持||和&amp;&amp;为你的逻辑工作,只使用|和&amp;用于按位操作。

同样,虽然这只是偏好。