C#IComparer <t>标准使用问题</t>

时间:2010-07-22 16:22:41

标签: c# standards icomparer

我有一个问题,这是否是在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);

4 个答案:

答案 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 == bb == c a == c(相等的传递属性),则是接口合同的一部分。这不会在代码中的任何地方强制执行,但它需要才能正常运行。

答案 2 :(得分:3)

是的,那将是标准。它明确声明为IComparable:

  

如果A.CompareTo(B)返回零和   B.CompareTo(C)返回零,然后   A.CompareTo(C)需要返回   零。

我在官方文档中找不到任何内容,并为ICompare说明了同样的事情,但我认为可以安全地假设同样适用。

答案 3 :(得分:2)

平等是可传递的,所以是的,你应该假设,并考虑到这一点开发你的IComparer。

Transitivity