Страницы

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

среда, 24 октября 2018 г.

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

Положим, есть следуюший класс:
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/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 ту же логику можно выразить гораздо проще.

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

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