Как стать автором
Обновить

Комментарии 12

Еще ругают С++ за его адовые конструкции и 100500 способов сделать один и тот же результат.

Можно даже в один OrderBy)

var items = arr.OrderBy(p => (p.Primary, p.Secondary));

😅

Можно объявлять конкурс, кто извращённее изощрённее проведёт сортировку. :)

А давно так можно стало? И где написано чтобы почитать, что ключ сортировки может быть кортежем? Что-то на MSDN не вижу сходу такого.

А в чём противоречие?

В OrderBy может быть любой объект, для сортировки будет использоваться IComparer, по умолчанию Comparer<TKey>.Default.

Т.е у ValueTuple реализован интерфейс сравнения и будет использоваться это сравнение объектов.

И правда. Забавно.

... получить правильный результат можно и через последовательность вызовов OrderBy().OrderBy(), нужно только поменять вызовы местами.

Чтобы это работало, в реализациии OrderBy должна использоваться устойчивая сортировка. В то же время, SQL-оператор ORDER BY не гарантирует устойчивость. Поэтому я бы не поручился за то, что все провайдеры LINQ-to-SQL правильно обработают это ваше .OrderBy().OrderBy().

Неужели вообще кто-то так делает? Откуда возникла идея написать статью на тему «сравним в подробностях два способа сделать сортировку: очевидно правильный, быстрый и предсказуемый и очевидно неправильный, медленный и с граблями»?

Неужели вообще кто-то так делает? Откуда возникла идея написать статью на тему «сравним в подробностях два способа сделать сортировку: очевидно правильный, быстрый и предсказуемый и очевидно неправильный, медленный и с граблями»?

В статье я отвечаю на этот вопрос в разделе "Предыстория". Можно почитать комменты на Хабре: тык.

Некоторые из описанных в той статье вызовов OrderBy().OrderBy() разработчики править не стали (Unity, например).

Поэтому я бы не поручился за то, что все провайдеры LINQ-to-SQL правильно обработают это ваше .OrderBy().OrderBy()

В LINQ to Objects, когда на вход поступает нечто, реализующеее IEnumerable но не IQueryable, провадеры не используются, и OrderBy реализуется методом Enumerable.OrderBy. А для него документация явно сообщает, что сортировка является устойчивой.
У метода Enumerable.OrderBy есть второй перегруженный вариант, который принимает дополнительным параметром интерфейс IComparer<TKey> Если сделать делегат keySelector возвращающим сам объект класса Wrapper — p=>p и реализовать и предать в OrderBy IComparer<Wrapper>, который сравнивает объекты Wrapper сначала по primary, а при их равенстве — по secondary), то можно просто один сетод OrderBy в этом варианте, чтобы выполнить однократную сортировку, а не двукратную.
Да, это потребует пяток лишних строк кода, но, может, если уж речь зашла о производительности, оно того стоит?

С тем же успехом можно написать статью о том, что лучше - надевать штаны через голову или обычным способом. И в конце вывод, что обычным все-таки быстрее, расходуется меньше энергии и т.п.

Генезис сравнения я описал в статье. Он взят не с потолка.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий