c# - Equals is used. GetHashCode is not -
i have implemented class below:
public class carcomparer : iequalitycomparer<car> { public bool equals(car car1, car car2) { if (car1 == null || car2 == null) return false; return (car1.description == car2.description); } public int gethashcode(car car) { unchecked { int hash = 17; hash = hash * 29 + car.id.gethashcode(); hash = hash * 29 + car.description.gethashcode(); return hash; } } }
now see this:
car p1 = new car() { id = guid.newguid(), description = "test1" }; car p2 = new car() { id = guid.newguid(), description = "test1" }; car p3 = new car() { id = guid.newguid(), description = "test1" }; car p4 = new car() { id = guid.newguid(), description = "test1" }; var hash = new hashset<car>(); hash.add(p1); hash.add(p2); var hash2 = new hashset<car>(); hash2.add(p3); hash2.add(p4); var carcomparer = new carcomparer(); assert.that(hash, is.equivalentto(hash2).using(carcomparer));
i put breakpoints in .equals , .hashcode. equals used; gethashcode not. why?
you comparing 2 hashset
using nunit is.equivalentto
. there no reason call gethashcode
- compares 2 collections equality of members. that's why gethashcode
never called , equals
called compare 2 items different hashset
s equality. hashsets lists or other enumerable - doesn't change when comparing 2 collections.
you might expect gethashcode
called when add item hashset
- it's not so, because @ point carcomparer
not yet known - don't pass hashset
constructor. if this:
var hash = new hashset<car>(new carcomparer());
then gethashcode
called when add new item corresponding hashset
.
Comments
Post a Comment