Linq歧义在哪里和选择
本文关键字:选择 在哪里 歧义 Linq | 更新日期: 2023-09-27 18:14:49
今天我遇到了一个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()
如果select和where都返回IEnumerable<T>
,那么为什么有歧义?谢谢你。
Select
是一个投影,因此您得到的是表达式p.qty > 0
对somelist
中的每个元素求值。即大量的真/假值(与原始列表相同的数字)。所以当你对它做Count
时,你会得到相同的数字。如果你看,选择将返回IEnumerable<bool>
(因为p.qty > 0
的类型是bool)。
Where
过滤结果,因此count在过滤列表上运行,并给出预期的结果。此类型为IEnumerable<TypeOfElementInOriginalList>
。
注意你也可以这样做:somelist.Count(p => p.qty > 0)
,因为Count有一个重载,它接受一个谓词来过滤。
第一个查询的结果与somelist.Count()
相同。它就是序列中元素的个数。调用Select
项目每个对象,但对象的数量保持不变。
第二个查询给出满足谓词的元素数量,这可能是一个更小的数字。调用Where
从序列中筛选对象。
第一个查询返回一个布尔值IEnumerable。
第二个查询只返回与布尔表达式匹配的原始元素。
第一条语句创建了一个bools的IEnumerable
:是qty
字段> 0。因为有10条记录,所以得到10个bool
第二个返回经过条件过滤的IEnumerable。