IEnumerable jest leniwe

Jak myślicie co zwróci taki kod:

var list = new List<int>{1,2,3};
var filtered = list.Where(i => i > 1);
list.Clear();
return filtered.Count();

Oczywiście, że 0. A czemu? Bo IEnumerable jest leniwe. Jeśli nie musi, to nie ruszy czterech liter i nie wykona się. Wykonanie jest odroczone do momentu pobrania wartości (czy to foreach, czy np. .Any()).

W powyższym przykładzie filtrowanie jest wykonane w momencie użycia Count(), czyli gdy lista jest już pusta. Należy o tym pamiętać. Gdy mimo wszystko chcemy wartości mieć wyliczane natychmiast należy dodać .ToList() albo .ToArray().

Aby powyższy przykład działał tak jak chcę powinien wyglądać tak:

var list = new List<int>{1,2,3};
var filtered = list.Where(i => i > 1).ToList();
list.Clear();
return filtered.Count();
Ten wpis został opublikowany w kategorii Oczywiste oczywistości i oznaczony tagami , . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

Bądź pierwszy!

Powiadom o
avatar

wpDiscuz