Отложенное выполнение
Операторы LINQ to Objects вроде Where и Select из класса Enumerable не обходят источник сразу: цепочка хранится как отложенный запрос. Обход начинается при материализации, например при ToList, Count или First.
Синтаксис
IEnumerable<T> query = source.Where(x => x > 2);
// обход ещё не начался
List<T> res = query.ToList();
Пример
Давайте построим запрос и материализуем его через ToList:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> nums = new List<int> {1, 2, 3, 4, 5};
var query = nums.Where(n => n > 2);
List<int> res = query.ToList();
Console.WriteLine(string.Join(" ", res));
}
}
Результат выполнения кода:
"3 4 5"
Пример
Давайте убедимся, что Count тоже запускает обход:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
List<int> nums = new List<int> {1, 2, 3, 4, 5};
var query = nums.Where(n => n % 2 == 0);
Console.WriteLine(query.Count());
}
}
Результат выполнения кода:
2
Смотрите также
-
метод
Where,
который откладывает фильтрацию -
метод
ToList,
который материализует запрос -
метод
Select,
который откладывает проекцию -
класс
Enumerable,
где объявлены операторы LINQ to Objects