【发布时间】:2016-01-09 16:45:39
【问题描述】:
我有一个 IEnumerable<T>,我想根据 LINQ 谓词进行过滤。我尝试像往常一样在IEnumerable 上使用Where,但这次我偶然发现了一些有趣的东西。当使用谓词在 IEnumerable 上调用 Where 时,我得到一个空列表作为回报。我知道它必须生成一个包含两个项目的列表。如果我改用 FindAll 和相同的谓词,它会产生正确的结果。
谁能给我解释一下,为什么会这样?我一直认为Where 是FindAll 的懒惰版本,它也返回IEnumerable 而不是List。应该不止这些吧? (我做了一些研究,但无济于事。)
代码:
IEnumerable<View> views = currentProject.Views.Where(
v => v.Entries.Any(e => e.Type == InputType.IMAGE || e.Type == InputType.VIDEO));
IEnumerable<View> views = currentProject.Views.FindAll(
v => v.Entries.Any(e => e.Type == InputType.IMAGE || e.Type == InputType.VIDEO));
【问题讨论】:
-
List<T>.FindAll返回List<T>而Where返回IEnumerable<T>。但是Where使用的是延迟执行,所以只有当你 materialize 它时你才能得到它,f.e.ToList. -
您为什么不将其发布为答案? :) 比这里唯一的答案更好的解释,比您的评论晚发布。
-
即使您的评论回答了问题,但已经发布了一个答案,该答案比链接问题的任何答案都更彻底。
-
我知道:)
标签: c# .net linq list ienumerable