Обзор вопросов по языка програмиированию 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
}
Особенности:
Примеры отложенных методов:
WhereSelectTake, SkipOrderBy, ThenBySelectManyvar 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✨