4

我对这是否是在 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

4 回答 4

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。

我希望能澄清您对实施问题的疑问。

于 2010-07-22T16:26:14.027 回答
3

a == bif和b == cthat a == c(相等的传递属性)是接口契约的一部分。这在代码中的任何地方都没有强制执行,但它需要它才能正常运行。

于 2010-07-22T16:26:35.860 回答
3

是的,这将是标准。它为 IComparable 明确说明:

如果 A.CompareTo(B) 返回零且 B.CompareTo(C) 返回零,则要求 A.CompareTo(C) 返回零。

我在官方文档中找不到任何直接出来并为 ICompare 陈述相同内容的内容,但我认为可以安全地假设相同的情况。

于 2010-07-22T16:27:56.637 回答
2

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

传递性

于 2010-07-22T16:25:12.107 回答