1.1Kпросмотров
37.6%от подписчиков
23 января 2026 г.
Score: 1.2K
📎 Когда хочется коротко, но выходит долго GroupBy в LINQ удобный и выразительный, поэтому его часто тянут в любой код, где надо что то посчитать по ключу. Проблема в том, что GroupBy решает задачу группировки, а агрегация это частный случай, и за него иногда приходится платить лишним. Типичный паттерн выглядит так:
var totals = orders .GroupBy(o => o.CustomerId) .Select(g => new { CustomerId = g.Key, Total = g.Sum(o => o.Amount) }) .ToList(); Выглядит читабельно, но GroupBy внутри строит структуру групп, а значит элементы буферизуются и создаются объекты группировок, даже если в итоге нужен только итоговый Total. Если нужна именно аккумуляция, проще и дешевле сделать один проход и складывать суммы в словарь:
var totals = new Dictionary<int, decimal>();
foreach (var order in orders)
{ if (totals.TryGetValue(order.CustomerId, out var current)) totals[order.CustomerId] = current + order.Amount; else totals[order.CustomerId] = order.Amount;
} Это скучно, зато алгоритм читается буквально, один проход, явные обновления, без сюрпризов с материализацией групп. Профессор Си