Пользовательская логика сортировки в OrderBy с использованием LINQ

Каким будет правильный способ отсортировать список строк, в котором я хочу, чтобы элементы, начинающиеся с символа подчеркивания '_', находились внизу списка, в противном случае все в алфавитном порядке.

Прямо сейчас я делаю что-то вроде этого,

autoList.OrderBy(a => a.StartsWith("_") ? "ZZZZZZ"+a : a )

person Bala R    schedule 09.06.2010    source источник
comment
stackoverflow.com / questions / 2013198 /   -  person Tiju John    schedule 05.08.2019


Ответы (3)


Если вам нужен индивидуальный заказ, но не нужен компаратор, вы можете его использовать - стиль sql:

autoList
.OrderBy(a => a.StartsWith("_") ? 2 : 1 )
.ThenBy(a => a);
person Amy B    schedule 09.06.2010
comment
Мне больше нравится это решение. Я всегда забываю о ThenBy. - person Matt Greer; 09.06.2010

Я думаю, вам нужно использовать OrderBy(Func<>, IComparer<>) и указать свой собственный _ 2_, который реализует вашу настраиваемую логику.

person abatishchev    schedule 09.06.2010

Используйте перегрузку OrderBy, которая принимает IComparer, первый аргумент Func будет кормить компаратор, и оттуда вам нужно сравнить строки. Сначала рассмотрим случай, когда один или оба начинаются с _, а затем вам, вероятно, потребуется удалить _ и просто использовать стандартный string.Compare, чтобы отсортировать их за пределами первого _

person Matt Greer    schedule 09.06.2010
comment
Однако, честно говоря, хотя технически ваш подход является хакерским и может потерпеть неудачу, он намного проще и легче понять ваши намерения. - person Matt Greer; 09.06.2010