我的syncfunctions hashCode使用方法正确吗?

问题描述 投票:0回答:1

请阅读我之前的问题,因为我担心在对字符串使用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函数“仔细检查”它-那么这种方法可以安全使用吗?如果有可能发生碰撞,那么该机会有多大?

c# hashcode intersect except
1个回答
0
投票

是的,总会有哈希冲突,这就是为什么应该通过调用Equals()来确认身份的原因。必须实现GetHashCode()和Equals()correctly

LINQ to Objects Except()中的[internally使用HashSet,如果发生哈希冲突,它将调用Equals来保证身份。使用单个属性时,最好将其哈希代码和equals方法的调用代理在一起。

请在下面找到有关您的实现的评论:

与==的比较

可以使用==比较字符串,但是如果将类型更改为非原始,则会出现问题,因为将比较对象引用而不是内容。代理呼叫Equals()而不是==

对象的可变性

very error prone将gethashcode / Equals逻辑绑定到可变状态。我强烈建议封装状态,以便一旦创建对象后就不能更改它,为安全起见,请将set设为私有。

© www.soinside.com 2019 - 2024. All rights reserved.