Обзор вопросов по языка програмиированию C# и технологии NET
foreach
, ToList()
, Count()
, First()
).IEnumerable<T>
(например, Where
, Select
, Take
) отложенные.List<int> numbers = new() {1,2,3,4,5};
var query = numbers.Where(n => n > 2); // ещё не выполняется
numbers.Add(6); // это повлияет на результат
foreach(var n in query)
{
Console.WriteLine(n); // теперь выполняется, выводит 3,4,5,6
}
Особенности:
Примеры отложенных методов:
Where
Select
Take
, Skip
OrderBy
, ThenBy
SelectMany
var numbersList = numbers.Where(n => n > 2).ToList(); // выполняется сразу
numbers.Add(7);
Console.WriteLine(numbersList.Count); // не учитывает 7
Методы немедленного выполнения:
ToList()
, ToArray()
Count()
, LongCount()
Sum()
, Average()
, Min()
, Max()
First()
, FirstOrDefault()
, Single()
, SingleOrDefault()
Any()
, All()
, Contains()
Характеристика | Deferred Execution | Immediate Execution |
---|---|---|
Когда выполняется | При итерации | Сразу при вызове метода |
Память | Минимально | Все результаты материализуются |
Влияние изменений источника | Да | Нет, результат фиксирован |
Методы LINQ | Where, Select, Take, Skip, OrderBy | ToList, ToArray, Count, First, Sum, etc. |
Производительность | Эффективно при больших данных | Может быть дороже для больших данных |
Изменение источника данных
Отложенный запрос учитывает изменения:
var query = list.Where(x => x > 0);
list.Add(10);
foreach(var n in query) { ... } // включает 10
Немедленный запрос игнорирует изменения после материализации.
Повторная итерация
foreach
выполняет запрос заново.LINQ to SQL / IQueryable
ToList()
или foreach
.ToList()
, Count()
вызывают фактический запрос к БД.Побочные эффекты
Накладные расходы
var numbers = new List<int> {1,2,3};
var query = numbers.Where(n => n > 1); // Deferred
numbers.Add(4);
foreach(var n in query) Console.WriteLine(n); // 2,3,4
var numbers = new List<int> {1,2,3};
var result = numbers.Where(n => n > 1).ToList(); // Immediate
numbers.Add(4);
foreach(var n in result) Console.WriteLine(n); // 2,3
✨Dvurechensky✨