V3078. Original sorting order will be lost after repetitive call to 'OrderBy' method. Use 'ThenBy' method to preserve the original sorting.


Анализатор обнаружил потенциальную ошибку, связанную с тем, что один из методов 'OrderBy' или 'OrderByDescending' применяется для коллекции типа 'IOrderedEnumerable'. Это может быть связано с тем, что программист дважды вызвал этот метод, хотя необходимо было вызвать 'ThenBy' или 'ThenBuDescending'. Проблема кроется в том, что повторный вызов 'OrderBy...' для коллекции не учитывает порядок предыдущей сортировки, в отличии от 'ThenBy...'.

Рассмотрим пример:

var seq = points.OrderBy(item => item.Line)
                .OrderBy(item => item.Column);

В данном примере некоторая последовательность сортируется сначала по строкам, а затем получившаяся коллекция пересортировывается по столбцам. При этом результат предыдущей сортировки никак не учитывается.

Для того, чтобы сохранить результат предыдущей сортировки, во втором случае необходимо вызвать метод 'ThenBy'.

var seq = points.OrderBy(item => item.Line)
                .ThenBy(item => item.Column);

Аналогичную ошибку можно допустить при написании кода с использованием синтаксиса запроса:

var seq = from item in points
          orderby item.Line
          orderby item.Column 
          select item;

В результате вторичной сортировки, предыдущий результат также теряется. Код можно исправить следующим образом:

var seq = from item in points
          orderby item.Line, item.Column
          select item;

Найденные ошибки

Проверено проектов
367
Собрано ошибок
13 552

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;