2013-11-04 160 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 –