#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 ту же логику можно выразить гораздо проще.
Комментариев нет:
Отправить комментарий