alexeyfv

Опубликовано

- 1 мин чтения

Используйте индексаторы вместо методов LINQ

C# Performance Code Quality
img of Используйте индексаторы вместо методов LINQ

Это часть серии, в которой я разбираю правила качества кода .NET с точки зрения производительности. Сегодня поговорим про CA1826: Use property instead of Linq Enumerable method.

Описание правила

Правило рекомендует не использовать методы First(), Last(), Count() из LINQ с IReadOnlyList<T>:

   IReadOnlyList<string> list = ["str1", "str2", "str3"];
var first = list.First();   // CA1826
var last = list.Last();     // CA1826
var count = list.Count();   // CA1826

Вместо этого стоит использовать индексатор или свойство Count:

   IReadOnlyList<string> list = ["str1", "str2", "str3"];
var first = list[0];
var last = list[^1];
var count = list.Count;

Анализ производительности

Я написал простой бенчмарк, чтобы проверить, насколько LINQ действительно влияет на производительность. Результаты в репозитории и на диаграмме ниже.

График сравнения производительности между методами LINQ и индексатором и свойством Count

График сравнения производительности между методами LINQ и индексатором и свойством Count

Как видно, разница есть. Но она совсем небольшая — всего несколько микросекунд на моём ноутбуке.

Стоит ли заморачиваться?

В большинстве случаев — нет. Прирост производительности минимальный. Но если вы пишете высокопроизводительный код или используете LINQ методы в цикле — возможно код стоит отрефакторить.