2011-11-15 26 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过滤条件。