2013-11-04 157 views
2

我有以下LINQ声明:那2个linq相当于?

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

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

在if条件。

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

是否有任何理由使用比#2更多#1或反之亦然?

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

+2

使用'2'更方便,简洁,当然我们应该使用它。顺便说一句,我发现第二个有点**比第一个更容易阅读。 –

+2

技术上'2'可能会更快一点,因为'1'需要创建一个WhereEnumerableIterator实例。我不相信你能够观察到这种差异。 – decPL

+1

我曾经偶然发现了以下错误:'_champs.Select(a => a.NoPage == noPage + 1).Any()'。由于“选择”这个短语的内涵,很容易错过这样的事实,即它不能达到预期的效果!完整的解释对观众来说是一件容易的事。我为简洁版提供建议。 –

回答

8

是的他们都是等于

Is there any reason to use more #1 than #2 or vice and versa?

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

0

它们是相等的,并且很可能会被优化为相同的表达式树。

+2

如果这是简单的Linq-to-Objects,即在委托为'Func '的'Enumerable'上工作,则没有表达式树。在这种情况下,它不会被优化到同样的事情。他的第一个版本比第二个版本更直接。 –

+0

这就是为什么“可能”:) – LINQ2Vodka

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和for的问题许多像EntityFramework这样的ORM只会产生一个对数据库的调用,请记住,在技术上可能会有一些未优化的ORM可能会产生两个对数据库的调用,因为有两个方法调用,尽管我没有看过或没有发现任何调用。

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

+0

感谢您的实际编译代码+1 –