Ho un IEnumerable<T>
che ho voluto filtrare in base a un predicato LINQ. Ho provato a utilizzare Where
sullo IEnumerable
come al solito, ma questa volta sono incappato in qualcosa di interessante. Quando si chiama Where su the IEnumerable
, con il predicato, ottengo una lista vuota in cambio. So che deve produrre un elenco con due elementi. Se invece utilizzo FindAll
, con lo stesso predicato, esso produce il risultato corretto.FindAll Vs Where
Qualcuno può spiegarmi perché questo sta accadendo? Ho sempre pensato che Where
fosse una specie di versione lazy di FindAll
, che restituiva anche un IEnumerable
invece di uno List
. Ci deve essere più di questo? (Ho fatto qualche ricerca, ma inutilmente.)
Codice:
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 .FindAll' restituisce un 'Elenco ' considerando che 'Dove' restituisce un' IEnumerable '. Ma 'Where' sta usando l'esecuzione posticipata, quindi lo si ottiene solo quando si _materializza_, per esempio. con 'ToList'. –
Perché non l'hai postata come risposta? :) Una spiegazione migliore rispetto all'unica risposta qui, che è stata pubblicata più tardi del tuo commento. –
Anche se il tuo commento ha risposto alla domanda, è stata inviata una risposta, che risponde in modo più completo rispetto a qualsiasi risposta nella domanda collegata. –