我有一个问题,这是否是在C#中使用IComparer的标准。假设我有三个Person对象的情况:P1,P2和P3。假设我调用在P1和P2中传递的Compare方法,结果为0.这实质上意味着两个人应该被归类为相等。现在说我调用在P2和P3中传递的Compare方法,结果也是0。再次,这意味着两个人是平等的。从逻辑上讲,人们可以假设P1和P3也是相等的;但是,可以实现Compare方法,但有人决定实现它。那么实现它的标准是这样的,P1和P3在这种情况下也会返回0?
这是我要问的代码:
// 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);
答案 0 :(得分:4)
它与C#无关,这是一个简单的数学规则:及物性: http://en.wikipedia.org/wiki/Transitive_relation
所以,简而言之。
---添加了评论信息---
如果您去阅读有关IComparer的文档: http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare.aspx
你会看到:Compares two objects and returns a value indicating whether one is less than,
equal to, or greater than the other.
换句话说,这意味着在比较对象“a”和“b”时,在多次调用方法Compare时应始终得到相同的结果。如果情况并非如此,则意味着您将获得未定义的行为,并且无法依赖该函数进行任何排序或比较。
因此,当您正确实施此方法时,适用传递规则,您可以毫无疑问地说a == c。
我希望澄清你对实施问题的质疑。
答案 1 :(得分:3)
如果a == b
和b == c
a == c
(相等的传递属性),则是接口合同的一部分。这不会在代码中的任何地方强制执行,但它需要才能正常运行。
答案 2 :(得分:3)
是的,那将是标准。它明确声明为IComparable:
如果A.CompareTo(B)返回零和 B.CompareTo(C)返回零,然后 A.CompareTo(C)需要返回 零。
我在官方文档中找不到任何内容,并为ICompare说明了同样的事情,但我认为可以安全地假设同样适用。
答案 3 :(得分:2)
平等是可传递的,所以是的,你应该假设,并考虑到这一点开发你的IComparer。