2013-05-19 62 views
3

什麼是lambda表達式等價於下面的代碼lambda來collection.Count(謂語)

int[] numbers = { 3, 4, 5, 6, 7, 8 }; 
int count = numbers.Count(x => x > 5 == true); 

我想這一個,但它並沒有編譯:

var c = from number in numbers where number > 5 select numbers.Count; 

這一個沒有編譯:

var c = from number in numbers where number > 5 select new {numbers.Count}; 
+1

'numbers.Count(X => X> 5)'?無論如何,查詢語法中不存在與「計數」等效的內容。您必須將您的查詢包裝在括號中,然後調用帶有或不帶謂詞的「Count」。 –

+4

@Mitten看來你可能會讓你的語義有點偏離。你已經有了lambda表達式 - lambda運算符是'=>',所以使用這個運算符的任何表達式都是lambda表達式。您在這裏要求的是將您的lambda表達式轉換爲使用SQL-like-syntax-operators的等效表達式。 – Gjeltema

+0

@Gjeltema我看到了 - 我可能會有術語...是否有「SQL-like-syntax-operators」的簡稱?謝謝。 – Mitten

回答

6

你很近,只需要在括號中包裝LINQ表達式就像這樣:

var c = (from number in numbers where number > 5 select number).Count(); 
+2

我認爲你的意思是'選擇號碼',雖然你有什麼會編譯,並會給出正確的結果。 – hvd

+0

@hvd BTW爲什麼這兩個..選擇數字).Count()和..選擇numbers.Count()會產生相同的結果(3)?我會認爲需要選擇一個集合(數字),以便可以查詢大小,因爲單個數字沒有大小屬性​​。 – Mitten

+0

@Mitten - 它的工作原理是您實際上並未使用選定的值,只需計算結果的數量即可。你可以放置任何東西來代替數字,它會有相同的結果,例如'(從號碼> 5的數字中選擇1).Count();' – Lee

2

你在說什麼是查詢語法,並不是所有的LINQ方法在查詢語法中都有等價的。最簡潔的表達是numbers.Count(x => x > 5)。從docs

一些查詢操作,如CountMax,沒有等效查詢表達式子句,因此必須被表達爲方法調用。方法語法可以以各種方式與查詢語法相結合。

3

fromin的LINQ風格被稱爲 「查詢語法」:

from row in table where row.col1 < 10 select row.col1 

它通常包含比 「方法的語法」 lambda表達式少:

table.rows.Where(r => r.col1 < 10).Select(r => r.col1) 

你可以將它們混合也是。例如,這會爲所有行創建一個組,並計算行數。像FirstOrDefault()一個方法調用需要兌現的值:

int c = (
     from n in numbers 
     where n > 5 
     group n by 1 into g 
     select g.Count() 
     ).FirstOrDefault(); 
0
int[] numbers = { 3, 4, 5, 6, 7, 8 }; 
var n = numbers.Where(x => x > 5).Count();