Podczas korzystania z LINQ do zdefiniowania enumerable kolekcję, albo za pomocą metody rozszerzenie LINQ lub za pomocą operatorów zapytań aplikacja faktycznie nie budować kolekcję w tym czasie, że rozszerzenie LINQ metoda jest wykonywana; kolekcja jest wyliczana tylko wtedy, gdy iterujesz ją po . Oznacza to, że dane w oryginalnej kolekcji można zmieniać między wykonywaniem kwerendy LINQ a wyszukiwaniem danych identyfikujących kwerendę; zawsze będziesz pobierać najbardziej aktualne dane z .LINQ i ocena odroczony
Microsoft Visual C# 2013 krok po kroku napisane przez Johna Sharpa
Napisałem następujący kod:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<int> res = numbers.FindAll(a => a > 0).Select(b => b).ToList();
numbers.Add(99);
foreach (int item in res)
Console.Write(item + ", ");
Wynikiem powyższego kodu jest pokazany poniżej:
1, 2, 3, 4, 5,
Dlaczego to działa? Wiem o Func
, Action
i Predicate
, ale nie mogę się dowiedzieć, co się tutaj dzieje. W oparciu o powyższą definicję kod nie jest racjonalny.
Spróbuj usunąć 'ToList()' na końcu –
@MatiasCicero Próbowałem, ale nie miałem żadnego efektu. – Media
'ToList()' tworzy * nową * listę ('res') i kopiuje wszystkie elementy, ale dodajesz do * starej * jednej (' liczby') –