我试图了解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
答案 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();