具有相同哈希码的两个不同对象的确定性排序

时间:2017-02-17 17:55:01

标签: c# .net c#-4.0

假设我有两个相同(任意)类型的不同对象传递给泛型函数。我需要一种方法来每次都以相同的方式对它们进行排序,无论它们作为参数传递给哪个顺序。它们的顺序并不重要,只是在边缘情况下它们具有相同的哈希码,但不传递.equal。在大多数情况下,它们具有不同的哈希码,将简单地使用哈希码。

假设:

  • 相同的基本类型
  • 相同的哈希码
  • 不一样的对象
  • 参考类型
  • 无法固定对象
  • .Equals返回false
  • object.ReferencesEquals返回false
  • 两个对象都不为空
  • 订单只需要在特定程序集的特定运行时内保持一致

希望有人可以提出一个创造性的解决方案来解决这个罕见的,但却很麻烦的边缘情况。感谢

1 个答案:

答案 0 :(得分:1)

首先定义一个完全依赖于身份的相等比较器:

private static ReferenceEqualityComparer<T> : IEqualityComparer<T> where T:class
{
    public bool Equals(object x, object y) => ReferenceEquals(x, y);

    public int GetHashCode(object obj) => RuntimeHelpers.GetHashCode(obj);
}

然后(理想情况下,作为最后的手段,尝试了其他可能的方法),将元素添加到Dictionary<T, int>中,将其作为比较器,将对象作为键,并将增量数作为值

该值成为您的决胜局,保证每次都断言相同的顺序。