那2个linq是等价的吗?

时间:2013-11-04 14:54:40

标签: c# linq

我有以下linq声明:

_champs.Where(a => a.NoPage == noPage + 1).Any()

_champs.Any(a => a.NoPage == noPage + 1)

在if条件下。

第一个看起来更容易为我阅读,看起来比第二个更合乎逻辑,但两者都工作得很好。

是否有任何理由使用#2而不是#2或反之亦然?

编辑:我会坚持第二个,因为它看起来比第一个好一点。它也很容易阅读,听起来更自然......实际上我在代码中经常找到第二个(快速查找后)

3 个答案:

答案 0 :(得分:8)

是的,两者都相等

  

是否有任何理由使用#2而不是#2或反之亦然?

为清楚起见,Any的第二个版本很清楚,IMO。因为它显示代码正在寻找Any实例的存在的意图。

答案 1 :(得分:1)

它们等效但不等于

它们将返回相同的结果,但编译器会生成不同的IL。 (即使在发布模式下也不会优化。)

对于此代码:

using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main()
        {
            var _champs = new List<Champ>();
            var noPage = 0;
            var q = _champs.Where(a => a.NoPage == noPage + 1).Any();
        }
    }
}

enter image description here

对于这个:

using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main()
        {
            var _champs = new List<Champ>();
            var noPage = 0;
            var q = _champs.Any(a => a.NoPage == noPage + 1);
        }
    }
}

enter image description here

虽然这对LinqToOjects来说实际上不是问题,但对于像EntityFramework这样的许多ORM,它只会生成一次对数据库的调用,请记住,从技术上讲,一些未经优化的ORM可以生成两次数据库调用,因为有两个方法调用,虽然我没有查找或发现任何。

总是更喜欢第二个,因为它比第一个更安全。

答案 2 :(得分:0)

它们是相同的并且很高 - 可能会针对相同的表达式树进行优化。