【问题标题】:linq ambiguity on where and select关于位置和选择的 linq 歧义
【发布时间】:2011-11-15 20:47:55
【问题描述】:

今天我遇到了一个由于拼写错误而弹出的 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() 

如果 select 和 where 都返回 IEnumerable<T> 那么为什么会模棱两可?谢谢。

【问题讨论】:

  • 感谢大家对 linq 101 的更新。
  • 这是那些有趣的命名问题之一,c# 试图在语法上像 sql(哪个 sql 建议您选择列),但是名称 Select,尤其是如果您放入谓词,可以像您一样阅读以仅选择通过的项目,实际上在 ruby​​ 和 smalltalk 中,这就是 select 方法所做的。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    第一个查询给出的结果与somelist.Count() 相同。这只是序列中元素的数量。调用Selectprojects每个对象,但对象的数量保持不变。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        第一条语句创建一个IEnumerable of bools:是qty 字段> 0。由于有10条记录,你得到10个bools。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-04
          • 1970-01-01
          • 2016-05-07
          • 1970-01-01
          • 2014-11-12
          • 1970-01-01
          • 2020-11-26
          • 2018-08-26
          相关资源
          最近更新 更多