两个选择计数查询之间的linq差异

时间:2014-07-11 08:14:07

标签: c# linq

我试图了解linq查询。我有一个包含8个元素的列表_taskDetail。我不明白为什么下面的第一个查询返回答案8?是的,列表包含8个元素,但所有td.Names都不同,我已经指定了td.Name == taskName,为什么它返回所有td.Name不等于taskName的元素?

第二个查询给出了1的预期和正确答案。

  var Ans1 = _taskDetail.Select(td => td.Name == taskName).Count();

  var Ans2 = (from tdList in _taskDetail
                   where tdList.Name == taskName
                   select tdList).Count();


  Ans1 = 8
  Ans2 = 1

2 个答案:

答案 0 :(得分:5)

第一个版本没有意义,你需要Where,而不是Select这是一个投影,而不是过滤器。

在第一个版本中,Select会返回IEnumerable<bool>(对于列表中的每个项目,如果Name == taskName则返回true,否则返回false。因此将返回所有项目,并且计数将给你...列表的计数。

所以

_taskDetail.Where(td => td.Name == taskName).Count();

顺便说一句,你可以简单地做

_taskDetail.Count(td => td.Name == taskName);

可能更好理解的细节

与您的实际(错误)第一版(方法语法)对应的第二个(错误)版本(查询语法)将是

(from tdList in _taskDetail
 select tdList.Name == taskName).Count();

答案 1 :(得分:2)

这是因为第一个查询错误。 Select仅生成投影,不会过滤结果。正确的执行方式是使用Where而不是Select ...

var Ans1 = _taskDetail.Where(td => td.Name == taskName).Count();