У меня есть IEnumerable<T>
, который я хотел отфильтровать на основе предиката LINQ. Я пробовал использовать Where
на IEnumerable
, как я обычно делаю, но на этот раз я наткнулся на что-то интересное. При вызове «Где» на IEnumerable
с предикатом я получаю пустой список в обратном порядке. Я знаю, что он должен создать список с двумя элементами в нем. Если вместо этого я использую FindAll
, с тем же предикатом, он затем произведет правильный результат.FindAll Vs Where
Может кто-нибудь объяснить мне, почему это происходит? Я всегда думал, что 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));
'Список .FindAll' возвращает «Список ', тогда как 'Where' возвращает' IEnumerable '. Но 'Where' использует отложенное выполнение, поэтому вы получаете его только тогда, когда вы _materialize_ его, т. Е. с 'ToList'. –
Почему вы не опубликовали это как ответ? :) Лучшее объяснение, чем единственный ответ здесь, который был опубликован позже вашего комментария. –
Несмотря на то, что ваш комментарий ответил на вопрос, был отправлен ответ, который отвечает на него более подробно, чем любой из ответов на связанный вопрос. –