我写了一个自定义比较器类。
public class ItemComparer : IEqualityComparer<Item>
{
public int GetHashCode(Item x)
{
return (x == null) ? 0 : new { x.Name, x.CompanyCode,
x.ShipToDate, x.Address }.GetHashCode();
}
当我新建两个项目并比较哈希码时,我的测试失败了。为什么哈希不同?
[TestMethod]
public void Two_New_Items_Have_The_Same_Hash_Code()
{
// arrange
var comparer = new ItemComparer();
Item x = new Item();
Item y = new Item();
// act
int xHash = comparer.GetHashCode(x);
int yHash = comparer.GetHashCode(y);
// assert
Assert.AreEqual(xHash, yHash);
}
编辑 - 这是完整的课程。我简单地使用上面的例子来简洁,但需要更多信息
public class DtoPolicy : DtoBase
{
[Description("The Policy Number")]
public string PolicyNumber { get; set; }
[Description("The Agent Code for the Agent who wrote the policy.")]
public string AgentCode { get; set; }
[Description("The First Name of the insured")]
public string FirstName { get; set; }
[Description("The Last Name of the insured")]
public string LastName { get; set; }
[Description("The Date of Birth of the insured")]
public DateTime DateOfBirth { get; set; }
[Description("The Age of the insured")]
public int Age { get; set; }
[Description("The Issue Date of the Policy")]
public DateTime PolicyIssueDate { get; set; }
[Description("The current status of the policy")]
public string PolicyStatus { get; set; }
public string TypeOfCoverage { get; set; }
public string PlanDescription { get; set; }
public decimal CompanyCode { get; set; }
public DateTime? TerminationDate { get; set; }
public decimal PolicyHolderSSN { get; set; }
[Description("The Zip Code of the insured")]
public string ZipCode { get; set; }
public decimal OwnerSSN { get; set; }
public string EmailAddress { get; set; }
public string WebUsername { get; set; }
public string OwnerFirstName { get; set; }
public string OwnerLastName { get; set; }
public string PayorFirstName { get; set; }
public string PayorLastName { get; set; }
public DateTime? PolicyEffectiveDate { get; set; }
public string AgentName { get; set; }
public string AgentPhone { get; set; }
public string InsuredCityState { get; set; }
public string InsuredAddress1 { get; set; }
public string InsuredAddress2 { get; set; }
public string InsuredCity { get; set; }
public string InsuredState { get; set; }
public string InsuredPhone { get; set; }
public string OwnerAddress1 { get; set; }
public string OwnerAddress2 { get; set; }
public string OwnerCity { get; set; }
public string OwnerState { get; set; }
public string OwnerZip { get; set; }
public string OwnerPhone { get; set; }
public string PayorAddress1 { get; set; }
public string PayorAddress2 { get; set; }
public string PayorCity { get; set; }
public string PayorState { get; set; }
public string PayorZip { get; set; }
public string PayorPhone { get; set; }
public DateTime? PaidToDate { get; set; }
public DateTime? LastPaidDate { get; set; }
public string PremiumMode { get; set; }
public decimal PremiumAmount { get; set; }
public DateTime? LastBillDate { get; set; }
public string BillingStatus { get; set; }
public decimal TotalLoanAmount { get; set; }
public decimal DividendAccumulation { get; set; }
public decimal ModalPremiumMonthly { get; set; }
public decimal ModalPremiumSemiAnnual { get; set; }
public decimal ModalPremiumQuarterly { get; set; }
public decimal ModalPremiumAnnual { get; set; }
public bool ElectronicBilling { get; set; }
public List<DtoClaim> Claims { get; set; }
public decimal MarketCode { get; set; }
public string BillingMode { get; set; }
public DtoPolicy()
{
Claims = new List<DtoClaim>();
}
}
GetHashCode的这个实现也为两个新对象返回不同的哈希
public int GetHashCode(DtoPolicy x)
{
return (x == null) ? 0 : x.Age.GetHashCode() ^ x.AgentCode.GetHashCode() ^ x.AgentName.GetHashCode() ^ x.AgentPhone.GetHashCode() ^
x.BillingMode.GetHashCode() ^ x.BillingStatus.GetHashCode() ^
x.Claims.GetHashCode() ^ x.CompanyCode.GetHashCode() ^ x.DateOfBirth.GetHashCode() ^ x.DividendAccumulation.GetHashCode() ^
x.ElectronicBilling.GetHashCode() ^ x.EmailAddress.GetHashCode() ^ x.FirstName.GetHashCode() ^ x.InsuredAddress1.GetHashCode() ^
x.InsuredAddress2.GetHashCode() ^ x.InsuredCity.GetHashCode() ^ x.InsuredCityState.GetHashCode() ^ x.InsuredPhone.GetHashCode() ^
x.InsuredState.GetHashCode() ^ x.LastBillDate.GetHashCode() ^ x.LastName.GetHashCode() ^
x.LastPaidDate.GetHashCode() ^ x.MarketCode.GetHashCode() ^ x.ModalPremiumAnnual.GetHashCode() ^ x.ModalPremiumMonthly.GetHashCode() ^
x.ModalPremiumQuarterly.GetHashCode() ^ x.ModalPremiumSemiAnnual.GetHashCode() ^ x.OwnerAddress1.GetHashCode() ^
x.OwnerAddress2.GetHashCode() ^ x.OwnerCity.GetHashCode() ^ x.OwnerFirstName.GetHashCode() ^
x.OwnerLastName.GetHashCode() ^ x.OwnerPhone.GetHashCode() ^ x.OwnerSSN.GetHashCode() ^ x.OwnerState.GetHashCode() ^
x.OwnerZip.GetHashCode() ^ x.PaidToDate.GetHashCode() ^ x.PayorAddress1.GetHashCode() ^
x.PayorAddress2.GetHashCode() ^ x.PayorCity.GetHashCode() ^ x.PayorFirstName.GetHashCode() ^ x.PayorLastName.GetHashCode() ^
x.PayorPhone.GetHashCode() ^ x.PayorState.GetHashCode() ^ x.PayorZip.GetHashCode() ^
x.PlanDescription.GetHashCode() ^ x.PolicyEffectiveDate.GetHashCode() ^ x.PolicyHolderSSN.GetHashCode() ^
x.PolicyIssueDate.GetHashCode() ^ x.PolicyNumber.GetHashCode() ^ x.PolicyStatus.GetHashCode() ^
x.PremiumAmount.GetHashCode() ^ x.PremiumMode.GetHashCode() ^ x.TerminationDate.GetHashCode() ^
x.TotalLoanAmount.GetHashCode() ^ x.TypeOfCoverage.GetHashCode() ^ x.WebUsername.GetHashCode() ^ x.ZipCode.GetHashCode();
}
答案 0 :(得分:6)
我认为你的某个职业有复杂的类型。因此: 当具有复杂类型时,GetHashCode对于每个实例化对象都是dirffent。
您可能需要实现更详细的gethashcode方法。
我假设你想加入每个属性的哈希码,例如像这样(未经测试的)
x.Name.GetHashCode() ^ x.CompanyCode.GetHashCode() ^ x.ShipToDate.GetHashCode() ^ x.Address.Id
how to implement GetHashCode for structure上的这篇文章介绍了多个属性的哈希码实现(在本例中为struct
)。
答案 1 :(得分:3)
如果我将Item
类定义为
public class Item
{
public string Name { get; set; }
public string CompanyCode { get; set; }
public DateTime ShipToDate { get; set; }
public List<string> Address { get; set; }
public Item()
{
//Uncomment Address initialization and the test fails..
//Address = new List<string>();
}
}
然后你的测试通过我。这些属性的类型是什么,以及它们如何在无参数构造函数中初始化?
修改:更新后 - 可能是在new List<DtoClaim>()
构造函数中创建的DtoPolicy
。