Mam IEnumerable<T>
, który chcę filtrować na podstawie predykatu LINQ. Próbowałem używać Where
na IEnumerable
jak zwykle, ale tym razem natrafiłem na coś interesującego. Podczas wywoływania Where na IEnumerable
, z predykatem, otrzymuję w zamian pustą listę. Wiem, że musi utworzyć listę zawierającą dwa elementy. Jeśli zamiast tego użyję FindAll
, z tym samym predykatem, to wtedy wygeneruje poprawny wynik.FindAll Vs Gdzie
Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje? Zawsze uważałem, że Where
było leniwą wersją FindAll
, która również zwróciła wartość IEnumerable
zamiast List
. Czy to musi być coś więcej? (Zrobiłem rozeznanie, ale bezskutecznie.)
Kod:
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' zwraca 'List ' podczas gdy 'Where' zwraca' IEnumerable '. Ale 'Where' używa odroczonego wykonywania, więc dostajesz je tylko wtedy, gdy go zmaterializujesz, f.e. z 'ToList'. –
Dlaczego nie zamieściłeś tego jako odpowiedzi? :) Lepsze wyjaśnienie niż jedyna odpowiedź tutaj, która została zamieszczona później niż komentarz. –
Pomimo tego, że w twoim komentarzu udzielono odpowiedzi na pytanie, została wysłana odpowiedź, która odpowiada na nią dokładniej niż jakakolwiek z odpowiedzi na powiązane pytanie. –