Обратная сортировка с IComparable

У меня есть такой код -

List<User> users;
protected class User : IComparable<User>
{
    public string name;
    public string email;
    public decimal total;
    public string address;
    public string company;
    public string origin;
    public int CompareTo(User b)
    {
        return this.total.CompareTo(b.total);

    }
}

Для таблицы, отсортированной по количеству баллов, которые имеет пользователь. Он сортируется в порядке возрастания, но нужно изменить его в порядке убывания. Он использует users.Sort(), но я не могу понять, как заставить его сортироваться в обратном порядке.


person Community    schedule 31.07.2014    source источник


Ответы (4)


Если вы хотите изменить порядок, просто отмените сравнение:

public int CompareTo(User b)
{
    return b.total.CompareTo(this.total);
}
person Selman Genç    schedule 31.07.2014

Если ваш класс User можно изменить для сортировки в обратном порядке, вы можете попробовать другие ответы, которые предлагают изменить метод CompareTo. В противном случае попробуйте следующее.

users.Sort();//Sort normally
users.Sort((x, y) => y.CompareTo(x));//Reverse sort
person Sriram Sakthivel    schedule 31.07.2014

Просто поменяйте местами параметры в сравнении. Итак, вместо:

return this.total.CompareTo(b.total);

Просто сделать:

return b.total.CompareTo(this.total);
person DavidG    schedule 31.07.2014

person    schedule
comment
Проблема с крайним случаем здесь! CompareTo не ограничивает диапазон возвращаемых значений, а из-за дополнительных 2-х чисел и переполнения у нас возникает ситуация, когда (Int32.MinValue * -1 == int32.MinValue), что может вызвать проблему. - person Paul Westcott; 26.10.2019