LINQ can allocate iterator objects, delegates, closures, lookup structures, and result collections, but the amount depends on the operators and provider. Streaming operators such as `Where` and `Select` use deferred execution and usually process one element at a time. `ToList`, `ToArray`, `GroupBy`, `OrderBy`, and repeated enumeration can require more memory. ```csharp IEnumerable<Order> expensive = orders .Where(order => order.Total > 1_000m) .Select(order => order); // deferred; no result list yet foreach (var order in expensive) Process(order); ``` Avoid accidental materialization and repeated pipelines: ```csharp var summaries = orders .Where(order => order.Total > 1_000m) .Select(order => new OrderSummary(order.Id, order.Total)) .ToArray(); // intentional snapshot, enumerated once ``` In database queries, keep operations on `IQueryable` until the final projection so the server filters rows. For a measured hot loop, a `foreach`, span-based code, or value-oriented API may allocate less. Prefer clarity first, then benchmark representative data before replacing LINQ.
Pooja Parmar · · 0 likes