今天我遇到了一个问题,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>
那么为什么会出现歧义?谢谢。
答案 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过滤掉条件。