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>,那么为什么有歧义?谢谢你。

Linq歧义在哪里和选择

Select是一个投影,因此您得到的是表达式p.qty > 0somelist中的每个元素求值。即大量的真/假值(与原始列表相同的数字)。所以当你对它做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。