2011-09-12 45 views
81

我知道,這是LINQ的:它是Linq還是Lambda?

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

而且我知道這是Λ:

var _Results = _List.Where(x => x.Value == 1); 

編者按:上述不僅僅是LAMBDA,它是使用LINQ的「方法 語法「其謂詞是Lambda。要清楚,以上 樣品都是Linq(我原來的帖子是不正確的,但我留下了錯誤 來說明混淆提示該問題)。

但是Linq是Lambda的子集還是什麼?

爲什麼有兩個看似相同的技術?

是否有技術上的理由選擇其中之一?

+2

更正:http://www.lambdaexpression.net/ –

回答

112

這是LINQ(使用查詢語法):

var _Results = from item in _List 
       where item.Value == 1 
       select item; 

這也是LINQ(使用方法的語法):

var _Results = _List.Where(x => x.Value == 1); 

有趣的是要注意,both of these flavors將最終產生完全相同的碼。編譯器爲您提供服務,允許您以您喜歡的方式表達您的願望。

而且是一個lambda:

x => x.Value == 1 

當您選擇使用方法語法,LINQ幾乎都是圍繞lambda表達式可見。但LINQlambdas是兩個完全不同的東西,兩者都可以自己使用。

更新:作爲svick正確地指出,LINQ與查詢語法使用lambda表達式來實現(如前面提到的,編譯器允許您在查詢語法寫的,但它有效地轉變爲方法的語法你背後)。這只是因爲兩種口味完全相同並且表現方式相同(例如,lambda表達式可能會導致創建closures)這一事實堆積如山。

+2

我認爲值得一提的是,查詢語法也在幕後使用lambdas。由於關閉,這可能很重要。 – svick

+0

@svick:確實,答案已更新。 – Jon

30

兩者都是Linq。第二個是使用Lambdas

Lambdas是在第二個示例中作爲參數傳遞給Where函數的內聯方法類型的東西。

這兩種語法之間的區別純粹是句法。使用方法調用的第二個linq樣式是它如何工作的。第一個意思是更方便用戶使用/編譯器將其轉換爲幕後方法調用。對於任何給定的查詢,它們應該都是相同的,儘管編譯器當然可以選擇對轉換爲方法樣式的複雜linq查詢的細微差別解釋。

這個MSDN文章也許是有趣的:LINQ Query Syntax versus Method Syntax。特別相關的是:「一般來說,我們推薦查詢語法,因爲它通常更簡單,更易讀;但是方法語法和查詢語法之間沒有語義差異。」

+1

對於MSDN建議。 –

+4

個人而言,我發現方法語法更具可讀性 - 也許是因爲我的大部分代碼都是「LINQ to Objects」變體。但是如果你有很多的SQL經驗,那麼起初查詢語法可能會更容易理解。 –

+0

@Tom Bushell,甚至JOIN語法?真的嗎? –