Что быстрее: LINQ-запрос или цикл foreach в C#?

«Что быстрее: LINQ-запрос или цикл foreach в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В подавляющем большинстве сценариев цикл foreach будет иметь немного более высокую производительность, чем эквивалентный LINQ-запрос, из-за отсутствия накладных расходов на вызовы делегатов, создание итераторов и дополнительные проверки.

Сравнение на примере:

// LINQ (читаемо, но с накладными расходами)
var evenNumbersSum = numbers.Where(n => n % 2 == 0).Sum();

// Цикл foreach (обычно быстрее)
int evenNumbersSum = 0;
foreach (var number in numbers)
{
    if (number % 2 == 0)
        evenNumbersSum += number;
}

Когда что использовать:

  • Выбирайте LINQ для:

    • Повышения читаемости и выразительности кода.
    • Сложных операций (группировка, соединения, сортировка).
    • Работы с IQueryable<T> (запросы к БД, где LINQ транслируется в SQL).
  • Выбирайте цикл for/foreach для:

    • Критичных к производительности участков кода ("горячих путей"), доказанных профилированием.
    • Очень простых операций над коллекциями.
    • Работы с Span<T> или Array, где важен контроль над памятью.

Вывод: Начинайте с чистого и читаемого LINQ. Оптимизируйте конкретные участки до циклов только после того, как профилировщик (например, BenchmarkDotNet) покажет, что это даст значимый прирост производительности для вашего конкретного случая. Разница часто пренебрежимо мала для типичного бизнес-логического кода.