簡體   English   中英

我的同步函數 hashCode 使用方法正確嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM