Как я могу сортировать, но положить нули внизу?
У меня есть список объектов, которые имеют ранг собственность. Это целое число.
Я хочу Сортировать по рангу на моем представлении, но когда я это делаю:
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);
быстрый пример использования пользовательских компараторов:
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);