[英]Is my syncfunctions hashCode usage approach correct?
請閱讀我之前的問題,因為我害怕在對字符串使用 hashCode 時發生沖突! 上一個問題
我有一個包含 repo 中項目的數據庫表,以及一個“傳入”函數,其中包含應該同步到數據庫表的模型中的項目。
我使用 intersect 和 except 使這成為可能。
我用於 sunc 目的的類:
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)將數據表項轉換為同步模型:
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) 取出要添加到數據庫中的項目,即存在於傳入模型中但不在數據庫中的項目:
var SyncModel_OnlyInModel =
ItemsInCampaignDiscountModel_SyncModel.Except(CommonItemInDbAndModel).ToList();
那么我的問題是 - 它會發生碰撞嗎? 在我的示例中,兩個不同的 ItemLookupCode 可以被視為相同的 ItemLookupCode 嗎? 因為相交並且除了使用 HashCode ! 或者使用 Equal 函數“仔細檢查”它 - 所以這種方法可以安全使用嗎? 如果它有可能發生碰撞,那么這個機會有多大?
是的,可能總是存在哈希沖突,這就是為什么應該通過調用Equals()
來確認身份的原因。 GetHashCode() 和 Equals() 必須正確實現。
LINQ to Objects 中的Except()
內部使用HashSet
,在散列沖突的情況下,它將調用 Equals 來保證身份。 當您使用單個屬性時,您最好代理對其 hashcode 和 equals 方法的調用。
請在下面找到有關您的實施的一些評論:
將字符串與 == 進行比較是很好的,但是如果類型更改為非原始類型,則會出現問題,因為將比較對象引用而不是內容。 代理調用Equals()
而不是==
。
將 gethashcode/Equals 邏輯綁定到可變狀態非常容易出錯。 我強烈建議封裝你的狀態,這樣一旦你創建了你的對象就不能改變它,為了安全起見,將set
私有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.