Коллекция вопросов ❓ на собеседовании в C# 🍧

Обзор вопросов по языка програмиированию C# и технологии NET


Project maintained by Dvurechensky-Docs Hosted on GitHub Pages — Theme by mattgraham

🕰️ Что такое отложенные (deferred) и немедленные (immediate) запросы в LINQ?

Typing SVG

Static Badge

✨ Оглавление

⬆ Вернуться к главной


1️⃣ Основная идея


2️⃣ Deferred execution — отложенные запросы

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
}

Особенности:

  1. Отложенное выполнение реагирует на изменения источника данных.
  2. Экономит память, особенно при больших коллекциях.
  3. Позволяет строить цепочки фильтров и трансформаций, которые не создают новые коллекции.

Примеры отложенных методов:


3️⃣ Immediate execution — немедленные запросы

var numbersList = numbers.Where(n => n > 2).ToList(); // выполняется сразу
numbers.Add(7);
Console.WriteLine(numbersList.Count); // не учитывает 7

Методы немедленного выполнения:


4️⃣ Отличия Deferred и Immediate

Характеристика Deferred Execution Immediate Execution
Когда выполняется При итерации Сразу при вызове метода
Память Минимально Все результаты материализуются
Влияние изменений источника Да Нет, результат фиксирован
Методы LINQ Where, Select, Take, Skip, OrderBy ToList, ToArray, Count, First, Sum, etc.
Производительность Эффективно при больших данных Может быть дороже для больших данных

5️⃣ Подводные моменты и каверзные вопросы

  1. Изменение источника данных

    • Отложенный запрос учитывает изменения:

      var query = list.Where(x => x > 0);
      list.Add(10);
      foreach(var n in query) { ... } // включает 10
      
    • Немедленный запрос игнорирует изменения после материализации.

  2. Повторная итерация

    • Deferred: каждый foreach выполняет запрос заново.
    • Immediate: данные уже в памяти, повторная итерация не вызывает повторного выполнения.
  3. LINQ to SQL / IQueryable

    • Deferred — SQL запрос формируется, но не выполняется до ToList() или foreach.
    • Immediate — ToList(), Count() вызывают фактический запрос к БД.
  4. Побочные эффекты

    • Если источник данных изменяется или имеет методы с побочными эффектами, Deferred может вызывать их несколько раз.
    • Immediate фиксирует результат один раз.
  5. Накладные расходы

    • Deferred экономит память, но при многократной итерации может выполнять один и тот же запрос несколько раз.
    • Immediate: больше памяти, меньше повторных вычислений.

6️⃣ Примеры

Отложенный запрос

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✨