104просмотров
55.9%от подписчиков
24 марта 2026 г.
Score: 114
Одна фильтрация лучше двух #dotnet #csharp #performance Частая ошибка в .NET-коде — повторно выполнять один и тот же запрос к коллекции. Конструкция вроде list.Where(x => x > 10).Count() и потом list.Where(x => x > 10).Sum() выглядит безобидно, но на деле вы дважды проходите по данным и дважды запускаете одну и ту же логику фильтрации. Для маленького списка разница может быть незаметной, но на больших коллекциях, в горячем коде или при сложном предикате это уже лишняя работа. Особенно неприятно, если источник данных — не обычный List, а IEnumerable, где за каждым проходом может скрываться дорогая операция или повторное вычисление. Плохо:
var count = list.Where(x => x > 10).Count();
var sum = list.Where(x => x > 10).Sum(); Здесь условие x > 10 применяется дважды, а коллекция перечисляется два раза. Если фильтр тяжёлый или данных много, это создаёт лишнюю нагрузку без какой-либо пользы. Лучше один раз отфильтровать данные и сохранить результат:
var filtered = list.Where(x => x > 10).ToList(); var count = filtered.Count;
var sum = filtered.Sum(); Так код становится предсказуемее: фильтрация выполняется один раз, а дальше вы работаете уже с готовым набором данных. Это особенно полезно, если после этого нужны ещё Average, Max или любая другая агрегация. Если важна максимальная эффективность, можно вообще посчитать всё за один проход:
var count = 0;
var sum = 0; foreach (var x in list)
{ if (x > 10) { count++; sum += x; }
} Такой вариант обычно выигрывает по производительности и не создаёт промежуточную коллекцию. Да, он менее декларативный, чем LINQ, зато в критичных местах даёт полный контроль над тем, сколько раз вы проходите по данным. Главное правило простое: если условие одно и то же, не заставляйте код вычислять его повторно без причины. LINQ удобен, но удобный код тоже стоит читать с точки зрения реальной стоимости выполнения. @aStateOfNet