请阅读我之前的问题,因为我担心在对字符串使用hashCode时会发生冲突!Previous question
我有一个数据库表,其中包含仓库中的项目,还有一个“传入”功能,其中包含应该同步的模型中的项目-与数据库表同步。
我正在使用相交,但要使其成为可能。
我用于其他目的的班级:
private class syncItemModel
{
public override int GetHashCode()
{
return this.ItemLookupCode.GetHashCode();
}
public override bool Equals(object other)
{
if (other is syncItemModel)
return ((syncItemModel)other).ItemLookupCode == this.ItemLookupCode;
return false;
}
public string Description { get; set; }
public string ItemLookupCode { get; set; }
public int ItemID { get; set; }
}
然后我在我的方法中使用它:1)将数据表项转换为syncmodel:
var DbItemsInCampaignDiscount_SyncModel =
DbItemsInCampaignDiscount(dbcampaignDiscount, datacontext)
.Select(i => new syncItemModel { Description = i.Description,
ItemLookupCode = i.ItemLookupCode,
ItemID = i.ID}).ToList();
2)将我的传入项目模型转换为同步模型:
var ItemsInCampaignDiscountModel_SyncModel = modelItems
.Select(i => new syncItemModel { Description =
i.Description, ItemLookupCode = i.ItemLookUpCode, ItemID =0 }).ToList();
3)相交:
var CommonItemInDbAndModel =
ItemsInCampaignDiscountModel_SyncModel.Intersect(DbItemsInCampaignDiscount_SyncModel).ToList();
4)取出要在数据库中删除的项目(传入模型项目中不存在的项目)
var SyncModel_OnlyInDb =
DbItemsInCampaignDiscount_SyncModel.Except(CommonItemInDbAndModel).ToList();
5)取出要添加到数据库中的项目,这些项目存在于传入模型中但不存在于db中:
var SyncModel_OnlyInModel =
ItemsInCampaignDiscountModel_SyncModel.Except(CommonItemInDbAndModel).ToList();
我的问题是-可能会发生冲突吗?在我的示例中,可以将两个不同的ItemLookupCode视为相同的ItemLookupCode吗?因为相交并且使用HashCode除外!还是通过Equal函数“仔细检查”它-那么这种方法可以安全使用吗?如果有可能发生碰撞,那么该机会有多大?
是的,总会有哈希冲突,这就是为什么应该通过调用Equals()
来确认身份的原因。必须实现GetHashCode()和Equals()correctly。
Except()
中的[internally使用HashSet
,如果发生哈希冲突,它将调用Equals来保证身份。使用单个属性时,最好将其哈希代码和equals方法的调用代理在一起。 请在下面找到有关您的实现的评论:
与==的比较
Equals()
而不是==
。对象的可变性
set
设为私有。