我有一个问题,这是否是在 C# 中使用 IComparer 的标准。假设我有一个情况,其中有三个 Person 对象:P1、P2 和 P3。假设我调用 Compare 方法并传入 P1 和 P2,结果为 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);
它与 C# 无关,它是一个简单的数学规则:传递性:http://en.wikipedia.org/wiki/Transitive_relation http://en.wikipedia.org/wiki/Transitive_relation
所以,简而言之,是的。
--- 由于评论而添加信息 ---
如果你去阅读有关 IComparer 的文档:http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare.aspx 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。
我希望澄清您对实施问题的疑问。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)