2011-11-15 32 views
8

今天我遇到了一個問題與LINQ的對象(不是SQL),由於錯字彈出。我在另一個地方有一個.Select一個地方和一個.Where。我期待着相同的結果,但他們顯示不同的數字。假設somelist有有qty所有元素10元= 0linq模糊不清,在哪裏,並選擇

//returns 10 - basically count of all rows. I am expecting 0 
somelist.Select(p => p.qty > 0).Count() 

//returns 0 - the correct count 
somelist.Where(p => p.qty > 0).Count() 

如果同時選擇並在返回IEnumerable<T>那麼爲什麼不確定性?謝謝。

+0

thx每個人都爲linq 101更新。 – Gullu

+0

這是一個有趣的命名問題,c#試圖在語法上像sql(其中sql建議您選擇列),但名稱'Select',特別是如果你放入一個謂詞,可以像你一樣閱讀,只選擇說那些通過實際上是通過ruby和smalltalk執行的項目就是'select'方法的作用。 – jbtule

回答

18

Select是一個投影,所以你得到的是表達p.qty > 0評估somelist中的每個元素。即很多真/假值(與原始列表相同的數字)。所以當你做Count就可以得到相同的數字。如果你看看select會返回IEnumerable<bool>(因爲p.qty > 0的類型是bool)。

Where對篩選結果進行過濾,以便在篩選列表上運行計數,併爲您提供預期結果。這種類型是IEnumerable<TypeOfElementInOriginalList>

請注意,您還可以這樣做:somelist.Count(p => p.qty > 0),因爲Count的overload接受要過濾的謂詞。

2

第一個查詢的結果與somelist.Count()相同。這只是序列中元素的數量。撥打Select項目每個對象,但對象的數量保持不變。

第二個查詢給出了滿足謂詞的元素數,該謂詞可能是較低的數字。來自Where的電話過濾器來自序列的對象。

0

第一個查詢返回一個IEnumerable的布爾值。

第二個查詢只返回匹配布爾表達式的原始元素。

0

第一條語句創建一個IEnumerable布爾值:qty字段> 0.由於有10條記錄,所以可以得到10個布爾值。

第二個返回一個IEnumerable過濾條件。