Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как реализовать IComparer<T> для сравнения нескольких свойств?

#c_sharp #net


Положим, есть следуюший класс:

class Operation
{
    public string Foo { get; set; }
    public string Bar { get; set; }
    public int Baz { get; set; }
}


Я хочу реализовать компарер IComparer. Код получается такой:

class OperationComparer : IComparer
{
    public int Compare(Operation x, Operation y)
    {
        if (x.Foo == y.Foo && x.Bar == y.Bar && x.Baz == y.Baz)
            return 0;
        else
            return 1; // ???
    }
}


Однако непонятно, что возвращать, если свойства не равны. Когда возвращать 1, а когда −1?
    


Ответы

Ответ 1



Общий порядок написания компарера следующий: Сравнить первое свойство, по которому происходит сравнение (сортировка), получив −1/0/1 (меньше/равно/больше). Если свойства не равны, вернуть −1 или 1 в соответствии с результатом сравнения. Для изменения порядка сортировки вернуть противоположное число. Если свойства равны, перейти к пункту 1 со следующим свойством. Если свойства кончились, вернуть результат последнего сравнения как есть. Код получается следующий: class OperationComparer : IComparer { public int Compare(Operation x, Operation y) { int cmp = string.Compare(x.Foo, y.Foo); if (cmp != 0) return cmp; cmp = string.Compare(x.Bar, y.Bar); if (cmp != 0) return cmp; cmp = x.Baz.CompareTo(x.Baz); return cmp; } } Стоит отметить, что в современном коде подобные компареры обычно не нужны, так как есть LINQ, в котором с помощью методов OrderBy и ThenBy ту же логику можно выразить гораздо проще.

Комментариев нет:

Отправить комментарий