1

我有一个案例,可以通过多种不同的方式比较两个对象是否相等。例如:

public class HeightComparer : IEqualityComparer<Person> {
   public bool Equals(Person x, Person y) {
       return x.Height.Equals(y.Height);
   }

   public int GetHashCode(Person obj) {
       return obj.Height;
   }
}

我将这些比较器Dictionary<Person,Person>(IEqualityComparer<Person>)用于各种方法。您将如何制作一个保证每个人都是独一无二的比较器?我想出了以下方法,但它运行缓慢,因为 GetHashCode() 方法通常返回相同的值。

public class NullPersonComparer : IEqualityComparer<Person> {
   public bool Equals(Person x, Person y) {
       return false; // always unequal
   }

   public int GetHashCode(Person obj) {
       return obj.GetHashCode();
   }
}

0我可以返回与from相同的值,GetHashCode(Person obj)但填充字典的速度仍然很慢。

编辑

这是一个用例:

 Dictionary<Person, Person> people = new Dictionary<Person, Person>(comparer);
 foreach (string name in Names)
 {
     Person person= new Person(name);
     Person realPerson;
     if (people.TryGetValue(person, out realPerson))
     {
         realPerson.AddName(name);
     }
     else
     {
         people.Add(person, person);
     }
  }
4

1 回答 1

2

如果类型没有覆盖EqualsorGetHashCode方法,那么它们的默认实现 fromobject会做你想做的事,即基于它们的标识而不是它们的值提供相等性。如果需要,您可以使用EqualityComparer<Person>.Default来获取IEqualityComparer使用这些语义的。

如果该Equals方法已被重写以提供某种值语义,但您不希望这样,您需要身份语义,那么您可以object.ReferenceEquals在自己的实现中使用:

public class IdentityComparer<T> : IEqualityComparer<T>
{
    public bool Equals(T x, T y)
    {
        return object.ReferenceEquals(x, y);
    }

    public int GetHashCode(T obj)
    {
        return System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(obj);
    }
}
于 2013-09-13T19:31:27.043 回答