设置始终为false的IEqualityComparer <t>的正确方法是什么?</t>

时间:2013-09-13 19:08:55

标签: c# .net-4.5 iequalitycomparer

我有一个案例,可以比较两个对象的许多不同的平等方式。例如:

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返回相同的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);
     }
  }

1 个答案:

答案 0 :(得分:2)

如果类型没有覆盖EqualsGetHashCode方法,那么它们的默认实现({1}}可以执行您想要的操作,即根据其身份提供相等性,而不是值。如果需要,您可以使用object来获取使用这些语义的EqualityComparer<Person>.Default

如果已覆盖IEqualityComparer方法以提供某种值语义,但您不希望这样,则需要标识语义,那么您可以在自己的实现中使用Equals:< / p>

object.ReferenceEquals