У меня есть вопрос, является ли это стандартом для использования IComparer в C#. Скажем, у меня есть ситуация, в которой есть три объекта Person: P1, P2 и P3. Скажем, я называю метод сравнения, проходящий в P1 и P2, и результат равен 0. Это по существу означает, что два человека должны быть отнесены к категории равными. Теперь скажем, что я называю метод сравнения, проходящий в P2 и P3, и результат для этого равен 0. Опять же, это означает, что два человека равны. Логически говоря, можно предположить, что P1 и P3 равны; однако метод Compare может быть реализован, однако кто-то решает его реализовать. Так ли это стандарт для его реализации таким образом, чтобы в этом случае P1 и P3 также возвращали 0?C# IComparer <T> вопрос использования
Вот код, что я спрашиваю:
// Assume these are initialized properly
Person p1 = null, p2 = null, p3 = null;
IComparer<Person> comparer = null;
// Compare person 1 to person 2 and result is 0
Debug.Assert(comparer.Compare(p1, p2) == 0);
// Compare person 2 to person 3 and result is 0
Debug.Assert(comparer.Compare(p2, p3) == 0);
// Would this be a fair assumption that person 1 and person 3 would also be 0?
Debug.Assert(comparer.Compare(p1, p3) == 0);
Я понимаю это, но метод Compare можно реализовать таким образом, чтобы переходное правило не применялось. Метод Compare может возвращать новые Random(). Next(); и тогда переходное правило не будет применяться.Поэтому я спрашиваю, является ли это стандартом для метода Compare, который реализуется там, где это правило применяется. – Nick
Это соглашение, более того, достаточно сильное, чтобы быть контрактом, который должен соблюдаться для правильной работы интерфейса. Неопределенное поведение, если вы не следуете контракту :) – user7116
Действительно смешно. Это как сделать метод: getCurrentTime() {return Time (Random()); }. Это просто не имеет смысла. Метод сравнения должен быть конечным и всегда иметь такое же поведение. В вашем примере это означает, что a.Compare (b) cond возвращает 3 разных результата, если вызвано 3 раза подряд. Я не думаю, что для этого предназначена эта функция. – Sauleil