linq歧义在哪里和选择

时间:2011-11-15 20:47:55

标签: c# vb.net linq c#-4.0 lambda

今天我遇到了一个问题,LINQ对象(不是SQL)由于输入错误而弹出。我在另一个地方有.Select个地方和.Where个地方。我期待相同的结果,但他们显示不同的数字。假设somelist有10个元素,所有元素都有qty = 0

//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>那么为什么会出现歧义?谢谢。

4 个答案:

答案 0 :(得分:18)

Select是一个投影,因此您得到的是p.qty > 0中为每个元素评估的表达式somelist。即许多真/假值(与原始列表相同的数字)。因此,当您对其进行Count时,您会得到相同的数字。如果你看,select会返回IEnumerable<bool>(因为p.qty > 0的类型是bool)。

Where会过滤结果,因此count会在已过滤的列表上运行,并为您提供预期的结果。其类型为IEnumerable<TypeOfElementInOriginalList>

请注意,您也可以这样做:somelist.Count(p => p.qty > 0)因为Count有overload接受谓词来过滤。

答案 1 :(得分:2)

第一个查询与somelist.Count()相同。它只是序列中元素的数量。调用Select 项目每个对象,但对象数量保持不变。

第二个查询给出了满足谓词的元素数量,这个数字可能更低。从序列调用Where 过滤对象。

答案 2 :(得分:0)

第一个查询返回一个IEnumerable的布尔值。

第二个查询仅返回原始中与布尔表达式匹配的元素。

答案 3 :(得分:0)

第一个语句创建IEnumerable个bools:qty字段&gt; 0.由于有10条记录,你得到10个bool。

第二个返回一个IEnumerable过滤掉条件。