c# - linq在何处和选择上的歧义

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

今天我遇到了一个 LINQ to objects(不是 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() 

如果同时选择和 where 返回 IEnumerable<T>那为什么会模棱两可呢?谢谢。

最佳答案

Select 是一个投影,所以你得到的是表达式 p.qty > 0somelist 中的每个元素进行评估.即很多真/假值(与原始列表相同的数字)。所以当你做 Count在上面,你得到相同的数字。如果您查看选择将返回 IEnumerable<bool> (因为 p.qty > 0 的类型是 bool)。

Where 过滤结果,以便计数在过滤后的列表上运行,并为您提供预期的结果。它的类型是 IEnumerable<TypeOfElementInOriginalList> .

注意你也可以这样做:somelist.Count(p => p.qty > 0)因为 Count 有一个 overload接受要过滤的谓词。

关于c# - linq在何处和选择上的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8142931/

相关文章:

c# - 用于显示大图像的 native WPF 与自定义 DirectX

c# - 找不到模块 'eslint-config-defaults/configurations/eslint'

c# - Microsoft Office 文档显示 Sharepoint URL 而不是本地

database - 从数据库读取/写入时设计代码流的最佳方法

javascript - 复选框第一次不反射(reflect)其选中值

.net - VB.NET 默认单选按钮在组框内选中

c# - 将 Active Directory 属性设置为 "not set"的 .Net 代码

c# - 重用 LINQ 选择功能

asp.net-mvc - 我如何使用 linq 翻页到我的列表

c# - 无法将类型为 'SZArrayEnumerator' 的对象转换为类型 'System.Collections.Generic.IEnumerator' 1[System.String]'