Как я могу сортировать, но положить нули внизу?

У меня есть список объектов, которые имеют ранг собственность. Это целое число.

Я хочу Сортировать по рангу на моем представлении, но когда я это делаю:

  myObjects = myObjects.Orderby(r=>r.Rank);

Я получаю все нули (это означает, что они не были установлены вверху)

Я хочу заказать по 1 --> n, но иметь нули в нижней части списка.

Я хотел бы, чтобы он был максимально эффективным, поскольку список довольно длинный

3 ответов


LINQ:

myObjects = myObjects
    .OrderBy(r => r.Rank == 0) //false before true
    .ThenBy(r => r.Rank);

этой не на самом деле сделать два полных сорта. Он объединит две лямбды в один сортировка словаря по два ключа.

Если вам не комфортно с не столь очевидным falseдоtrue правило, вы можете заменить первую лямбду на r => r.Rank == 0 ? 1 : 0 - но, зная falseдоtrue правило делает это действительно избыточным.


вы можете создать пользовательский компаратор (реализации IComparer) и сортируйте нули снизу. Псевдо-код будет:

public class ZeroComparer : IComparer {
    public int Compare(Object intA, Object intB) {
        if(intA == 0 && intB != 0)
            return -1;
        if(intA != 0 && intB == 0)
            return 1;
        return int.Compare(intA, intB);
    }
}

тогда используйте его как:

var comparer = new ZeroComparer();
myObjects = myObjects.Orderby(r=>r.Rank, comparer);

быстрый пример использования пользовательских компараторов:

используйте собственный IComparer с Linq OrderBy


myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank);

разобраться с делом Rank == int.MaxValue :

myObjects = myObjects.Orderby(r => r.Rank == 0 ? int.MaxValue : r.Rank - 1);