代码之家  ›  专栏  ›  技术社区  ›  andleer

linq where()单管或双管/与号

  •  6
  • andleer  · 技术社区  · 16 年前

    有人愿意评论我们是否应该在我们的linq where()扩展/查询中使用“i”或“i i”和“&”或“&&”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 回复  |  直到 9 年前
        1
  •  9
  •   Marc Gravell    16 年前

    你想要 || / && .

    嗯,单管( | / & )通常用于位算术,并且(除其他问题外)可能使代码库更难理解;它将 工作 在linq to对象中(因为位仍然是 定义 对于 bool ,但没有通常的短路。但是如果您的数据源是一个数据库(即混合中有一个表达式解析器),您可能会发现它在您身上爆炸。


    好吧;位可能会误导您,但和&仍是表达您意图的最合理和最预期的方式。我为任何困惑道歉。

        2
  •  4
  •   Amy B    9 年前

    任何人都愿意评论我们是否应该使用 | || & && 在我们的linq where()扩展/查询中?

    在lambda表达式中(例如经常在linq中使用的那些表达式),这些运算符的作用与在c中的作用相同。 γ & 是逻辑运算符,而 γ && 是短路逻辑运算符。如果你想要有效的代码,短路是很好的。如果你想避免短路是很糟糕的 分支代码 (可能是100%覆盖的UnitTest)。大多数人总是使用短路,分支不会干扰他们,因为他们避免使用有副作用的表达式,因此当一些表达式不被计算时,他们不会受到不良后果。

    下面是一个通过短路实现有用分支的示例:

    if (DatabaseIsAvailable() && QueryDataAndThereAreResults())
    {
      //do something with Results
    }
    

    当databaseIsavailable()为false时,将不计算queryDataAndTherearesults()。

    Linq to SQL有什么不同吗?

    对于Linq to SQL,使用哪个并不重要。标点符号将转换为T-SQL AND OR 操作员。将查询发送到数据库后,SQLServer查询计划优化器将确定是否短路。

        3
  •  1
  •   Stilgar    16 年前

    在您的示例中,它是完全相同的。运算符为bool类型重载,与||

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

    我更喜欢使用,因为人们已经习惯了它,大多数开发人员觉得它更自然。

        4
  •  0
  •   Ben Lesh    16 年前

    这取决于你的喜好。

    一般来说,大多数开发人员都坚持使用和&for all logical or's and's 尤其地 当他们在代码中处理一堆数字时,就像你一样。这是因为它在视觉上让其他开发人员感到困惑。

    所以,我的 意见 是为了您的逻辑工作坚持和&并且只为您的位操作使用和&。

    再说一遍,尽管这只是偏好。