Порядок по порядку сортировки больше 0 - PullRequest
4 голосов
/ 07 февраля 2012

Я пытаюсь отсортировать группу объектов, имеющих порядок сортировки, однако некоторые поля были инициализированы в 0, поэтому я хочу сначала отобразить все пользователи / объекты , которые имеют порядок сортировки (в правильном порядке), затем отобразите другие, например,

мой список

{id:4,name:"Tom", sortoder:0}
{id:14,name:"Bee", sortoder:0}
{id:401,name:"Mike", sortoder:1}
{id:13582,name:"Monty", sortoder:2}
{id:55,name:"Charlie", sortoder:0}
{id:9,name:"Khan", sortoder:9}

        var fields = GetFields(myobject) //get fields (not really relevant)
                     .OrderBy(x => x.sortoder > 0) //this is where I am stuck on
                     .ToList();

Все мои списки отображают пользователей с 0 сверху, чем те, которые имеют порядок сортировки

Ответы [ 3 ]

8 голосов
/ 07 февраля 2012

Либо используйте ThenBy, чтобы применить второй порядок после первого:

var fields = GetFields(myobject)
    .OrderByDescending(x => x.SortOrder > 0)
    .ThenBy(x => x.SortOrder)
    .ToList();

Или вы можете использовать условное выражение для замены значения 0 на int.MaxValue (при условии, что int.MaxValue непроисходят как законный SortOrder):

var fields = GetFields(myobject)
    .OrderBy(x => x.SortOrder == 0 ? int.MaxValue : x.SortOrder)
    .ToList();
4 голосов
/ 07 февраля 2012

Как насчет:

.OrderBy(x => x.sortorder != 0 ? x.sortoder : int.MaxValue)

Это в основном означает «обрабатывать 0 как специальное значение, эквивалентное int.MaxValue, но в противном случае просто используйте существующий сортировщик».

Подход Марка к первому упорядочению: «есть порядок сортировки, а не порядок сортировки», а затем по значению порядка сортировки (который, очевидно, будет равен 0 для второй группы) также будет работать нормально - это действительно просто вопрос личных предпочтений, какой подход вы используете.

0 голосов
/ 07 февраля 2012

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

var fields = GetFields(myobject) //get fields (not really relevant)
                 .OrderBy(x => (x.sortoder == 0) ? int.MaxValue : x.sortoder) //this is where I am stuck on
                 .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...