C# IComparer标准用法问题
我有一个问题,这是否是在 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);
I have a question with whether or not this is a standard for using IComparer in C#. Say I have a situation in which there are three Person objects: P1, P2, and P3. Say I call the Compare method passing in P1 and P2 and the result is 0. This essentially means the two people should be categorized as equal. Now say I call the Compare method passing in P2 and P3 and the result for that is 0 as well. Again, this means the two people are equal. Logically speaking, one can assume P1 and P3 are equal as well; however, the Compare method could be implemented however someone decides to implement it. So is it a standard to implement it in such a way that P1 and P3 would also return 0 in this case?
Here's code of what I'm asking:
// 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);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
它与 C# 无关,它是一个简单的数学规则:传递性:
http://en.wikipedia.org/wiki/Transitive_relation
所以,简而言之,是的。
--- 由于评论而添加了信息 ---
如果您去阅读有关 IComparer 的文档:
http://msdn.microsoft.com/en- us/library/system.collections.icomparer.compare.aspx
你会看到:
换句话说,这意味着当比较对象“a”和“b”时,调用时你应该总是得到相同的结果多次比较方法。如果不是这种情况,则意味着您将得到未定义的行为,并且不可能依赖该函数进行任何排序或比较。
因此,当您正确实现此方法时,传递性规则适用,您可以毫无疑问地说 a == c。
我希望澄清您对实施问题的疑问。
It has nothing to do with C#, it's a simple mathematical rule: Transitivity:
http://en.wikipedia.org/wiki/Transitive_relation
So, yes in short.
--- Added information due to comment ---
If you go and read the documentation about IComparer:
http://msdn.microsoft.com/en-us/library/system.collections.icomparer.compare.aspx
you'll see that:
In other word, that means that when comparing object "a" and "b", you should always get the same result when calling multiple time the method Compare. If it's not the case, it means that you will get undefined behavior and it will be impossible to rely on that function for doing any sorting or comparison.
So, when you implement this method properly, the Transitivity rule apply and you can say without any doubt that a == c.
I hope that clarify your questioning about the implementation problem.
是的,这将是标准。它明确规定了 IComparable:
我在官方文档中找不到任何内容,并且对 ICompare 陈述了相同的内容,但我认为可以安全地假设同样的情况成立。
Yes, that would be the standard. Its explicitly stated for IComparable:
I can't find anything in the official documentation that comes right out and states the same thing for ICompare but I think its safe to assume the same holds true.
这是接口契约的一部分,如果
a == b
并且b == c
则a == c
(相等的传递属性) 。这在代码中的任何地方都没有强制执行,但它是正确运行所必需的。It is part of the interface contract that if
a == b
andb == c
thata == c
(transitive property of equality). This is not enforced anywhere in code, but it is required for it to function correctly.平等是传递性的,所以是的,您应该假设这一点,并在开发您的 IComparer 时牢记这一点。
传递性
Equality is transitive, so yes you should assume that, and develop your IComparer with that in mind.
Transitivity