对象Equals相等性比较的通用实现

最近编码的过程中,使用了对象本地内存缓存,缓存用了Dictionary<string,object>, ConcurrentDictionary<string,oject>,还可以是MemoryCache(底层基于Hashtable)。使用缓存,肯定要处理数据变化缓存同步的问题。如何比较数据的变化,演进为新的内存对象数据和已有内存对象数据的相等性比较!

对象的Equals相等性比较,百度、google会有一大堆实现,几个重点的点:

1. 实现接口IEquatable<T>

https://msdn.microsoft.com/en-us/library/ms131190(v=vs.110).aspx

2.重写bool Equals(object other)方法和 int GetHashCode()方法

http://stackoverflow.com/questions/2734914/whats-the-difference-between-iequatable-and-just-overriding-object-equals

这里直接贴出来一个通用实现,分享给大家:

  1  /// <summary>2     /// 流控事件3     /// </summary>4     [Serializable]5     public class FlowControlEvent: IEquatable<FlowControlEvent>6     {7         public static readonly string Global = "Global";8 9         /// <summary>10         /// 标识11         /// </summary>12         public string ID { get; set; }13 14         /// <summary>15         /// 流控策略名称16         /// </summary>17         public string StrategyName { get; set; }18 19         /// <summary>20         /// 是否手工触发21         /// </summary>22         public bool IsManuelTrigger { get; set; }23 24         /// <summary>25         /// 触发时间26         /// </summary>27         public DateTime TriggerTime { get; set; }        28 29         /// <summary>30         /// 流控策略31         /// </summary>32         public FlowControlStrategy Strategy { get; set; }33 34         /// <summary>35         /// 持续时间,单位s36         /// </summary>37         public long Duration { get; set; }38 39         //是否启用40         private bool isEnable = true;41 42         /// <summary>43         /// 是否启用44         /// </summary>45         public bool IsEnable46         {47             get48             {49                 return isEnable;50             }51             set52             {53                 isEnable = value;54             }55         }56 57         /// <summary>58         /// 是否使用中59         /// </summary>60         public bool IsUsing61         {62             get63             {64                 if (IsEnable == false) return false;65                 if (IsManuelTrigger)66                 {67                     if (Duration == long.MaxValue)68                     {69                         return true;70                     }71                     else72                     {73                         var span = DateTime.Now - TriggerTime;74                         if (span.TotalSeconds > Duration)75                             return false;76                         else77                             return true;78                     }79                 }80                 else81                 {82                     return true;83                 }84             }85         }86 87         /// <summary>88         /// 创建时间89         /// </summary>90         public DateTime CreateTime { get; set; }91 92         /// <summary>93         /// 创建人94         /// </summary>95         public string Creator { get; set; }96 97         /// <summary>98         /// 最后修改时间99         /// </summary>
100         public DateTime LastModifyTime { get; set; }
101
102         /// <summary>
103         /// 最后修改人
104         /// </summary>
105         public string LastModifier { get; set; }
106
107         /// <summary>
108         /// 相等性比较
109         /// </summary>
110         /// <param name="other">要比较的对象</param>
111         /// <returns>true 相等 false 不相等</returns>
112         public override bool Equals(object other)
113         {
114             if (ReferenceEquals(null, other)) return false;
115             if (ReferenceEquals(this, other)) return true;
116             if (other.GetType() != this.GetType()) return false;
117
118             return Equals((FlowControlEvent)other);
119         }
120
121         /// <summary>
122         /// 流控事件是否等于同一类型的另一个流控事件
123         /// </summary>
124         /// <param name="other">同一类型的另一个流控事件</param>
125         /// <returns>true 相等 false 不相等</returns>
126         public bool Equals(FlowControlEvent other)
127         {
128             if (other == null)
129                 return false;
130             if (!string.Equals(this.ID , other.ID) || this.IsEnable != other.IsEnable || this.Duration!= other.Duration
131                 || !string.Equals(this.StrategyName, other.StrategyName)||this.TriggerTime!= other.TriggerTime)
132                 return false;
133
134             return true;
135         }
136
137         /// <summary>
138         /// 重载GetHashCode方法
139         /// </summary>
140         /// <returns>HashCode</returns>
141         public override int GetHashCode()
142         {
143             unchecked
144             {
145                 var result = 0;
146                 result = (result * 397) ^ ID.GetHashCode();
147                 result = (result * 397) ^ IsEnable.GetHashCode();
148                 result = (result * 397) ^ Duration.GetHashCode();
149                 result = (result * 397) ^ StrategyName.GetHashCode();
150                 result = (result * 397) ^ TriggerTime.GetHashCode();
151                 return result;
152             }
153         }
154     }

周国庆

2017/4/25

posted on 2017-05-12 10:36 叶祖辉 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/yezuhui/p/6844387.html

对象Equals相等性比较的通用实现相关推荐

  1. .net框架读书笔记---通用对象操作(一)

    接上一篇.net框架读书笔记---基础类型,这节主要学习这样正确实现所有对象都必须提供的一组通用操作---对象的等值性和唯一性: System.Object类型提供了一个名为Equals的虚方法,其目 ...

  2. hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?

    前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...

  3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

    面试题汇总 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? hashCode 的常规协定: 1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCo ...

  4. DDD理论学习系列(7)-- 值对象

    [DDD理论学习系列--案例及目录:http://www.jianshu.com/p/6e2917551e63] 1.引言 提到值对象,我们可能立马就想到值类型和引用类型.而在C#中,值类型的代表是s ...

  5. DDD如何区分实体和值对象

    前言 实体和值对象的区分是领域驱动设计中的老大难问题,建模过程中是必然会遇到的问题,我们在落地领域驱动设计过程中就遭遇了这类问题,下面介绍下我们落地过程中的经验. 实体 实体是指在你这个领域存在的一个 ...

  6. Java拾遗:001 - 重写 equals 和 hashCode 方法

    2019独角兽企业重金招聘Python工程师标准>>> 重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被 ...

  7. hashcode()方法和equals()方法

    一.hashcode()方法和equals()方法的介绍 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.eq ...

  8. 第9条:覆盖equals时总要覆盖hashCode

    在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,Hash ...

  9. equals 和 hashCode 到底有什么联系?一文告诉你

    转载自   equals 和 hashCode 到底有什么联系?一文告诉你 写在前面 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方 ...

最新文章

  1. Rancher搭建NFS服务器
  2. USG防火墙单出口接入互联网
  3. recv函数_第五十二章、send和recv函数
  4. ROADS POJ - 1724(最短路+邻接表+dfs)
  5. python defaultdict 简单了解
  6. 逻辑运算和作用域的问题
  7. SQL Server中TEXT类型操作
  8. 电视机鸿蒙os卡,开卖40天,搭载鸿蒙OS操作系统的华为电视就差评如潮?用户:亏了...
  9. 2018.08.02 权限管理 笔记
  10. onload 事件、DOMContentLoaded事件、DOM加载顺序
  11. Ubuntu LVM扩展LV
  12. GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)
  13. 时频分析之STFT:短时傅里叶变换的原理与代码实现(非调用Matlab API)
  14. Memcached damo
  15. poi怎么设置某个单元格为下拉框_java excel 多选下拉列表设置
  16. bindec() 函数
  17. 【Lesson 4】 和弦的大小增减属
  18. home为什么是地点副词_为什么home有副词的词性?
  19. python 解决问题的集合-No JSON object could be decoded
  20. 语义分割指标---MIoU详细介绍(原理及代码)

热门文章

  1. 网络配置文件、命令详解
  2. [题解]UVA10054 The Necklace
  3. scala入门之代码补全
  4. STL 队列queue
  5. MS SQL Server和MySQL区别
  6. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素
  7. 利用Windows自带服务架设免费邮件服务器
  8. 错误信息输出,重定向到文件
  9. Linux基础知识——常用shell命令介绍(三)
  10. 【备忘1】防止表格/层 被撑破的CSS控制代码