Одна из самых неприятных просадок производительности в C# начинается не с LINQ операторов, а с того, что коллекции начинают жить как
IEnumerable.Пример который встречается постоянно:
IEnumerable<Order> orders = GetOrders();
if (orders.Count() > 0)
{
// do something
}
Если внутри реально
List или массив, то количество элементов доступно быстро через свойство Count или Length, то есть без прохода по данным.Но
Count() как LINQ метод обязан работать для любого IEnumerable, поэтому в общем случае он перечисляет элементы, пока не посчитает все.Так проверка на пустоту внезапно становится полным обходом, и это особенно больно если orders это запрос с отложенным выполнением или поток данных.
А если хочется сохранить быстрый путь для коллекций, можно явно проверить интерфейс с Count:
if (orders is ICollection<Order> collection)
{
if (collection.Count > 0)
{
// fast path
}
}
else if (orders.Any())
{
// fallback
}
Если в профилировщике внезапно появился лишний проход по данным, стоит проверить где коллекция превратилась в
IEnumerable и где после этого зовется Count().📍 Навигация: Вакансии • Задачи • Собесы
🐸Библиотека шарписта
#sharp_view