当前位置: 首页 > 编程日记 > 正文

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

对象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

相关文章:

Android:ViewPager为页卡内视图组件添加事件

在数据适配器PagerAdapter的初始化方法中添加按钮事件&#xff0c;这里是关键&#xff0c;首先判断当前的页卡编号。必须使用当前的view来获取按钮。 Overridepublic Object instantiateItem(View arg0, int arg1) {if (arg1 < 3) {((ViewPager) arg0).addView(mListViews.g…

解析C语言中的sizeof

一、sizeof的概念 sizeof是C语言的一种单目操作符&#xff0c;如C语言的其他操作符、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于…

开源大咖齐聚2020启智开发者大会,共探深度学习技术未来趋势

​2020年12月2日&#xff0c;“OpenI/O 2020启智开发者大会”在北京国家会议中心召开。大会以“启智筑梦 开源先行”为主题&#xff0c;立足于国际国内开源大环境和发展趋势。开源领域顶尖专家学者和企业领军人物共聚一堂&#xff0c;探讨开源开放呈现出的新形势、新格局、新机…

linux中编译C语言程序

1.首先安装gcc编辑器 yum install gcc* -y 2.编写C语言程序 [roottest ~]# vim aa.c #include<stdio.h> int main( ) {int a;printf("请输入一个三位数的整数:");scanf("%d",&a);if(a>100&&a<1000)printf("百位是&#xff1a…

typedef的四个用途和两大陷阱

typedef的四个用途和两个陷阱 &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;…

升级版APDrawing,人脸照秒变线条肖像画,细节呈现惊人

作者 | 高卫华出品 | AI科技大本营随着深度学习的发展&#xff0c;GAN模型在图像风格转换的应用越来越多&#xff0c;其中不少都实现了很好的效果。此前&#xff0c;reddit上的一个技术博主AtreveteTeTe基于GAN模型混合将普通的人像照片卡通化&#xff0c;并通过First Order Mo…

error LNK1112: module machine type 'X86' conflicts with target machine type 'x64'

1 这个error是什么原因造成的 cmake默认选择的是x86&#xff0c;即32位的生成子。 2 怎么解决这个error 在cmake ..的时候&#xff0c;在后面加上“-G "Visual Studio 12 2013 Win64"”选项即可。 3 怎么在CMakeLists.txt中进行相应的设置来解决这个问题 这个还未知。…

Linux的epoll

在linux的网络编程中&#xff0c;很长的时间都在使用select来做事件触发。在linux新的内核中&#xff0c;有了一种替换它的机制&#xff0c;就是epoll。 相比于select&#xff0c;epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中&#x…

[QA]Python字节码优化问题

这篇文章来自在Segmentfault 上面我提出的一个问题 问题背景&#xff1a; Python在执行的时候会加载每一个模块的PyCodeObject,其中这个对象就包含有opcode,也就是这个模块所有的指令集合&#xff0c;具体定义在源码目录的 /include/opcode.h 中定义了所有的指令集合&#xff0…

【滴滴专场】深度学习模型优化技术揭秘

滴滴拥有海量数据以及 AI 推理需求&#xff0c;GPU 在人脸识别、自动驾驶、地图导航等场景大量使用&#xff0c;滴滴云IFX团队针对斯坦福 DAWNBench 榜单的 ImageNet 模型也进行了深入优化&#xff0c;在 NVIDIA T4 上达到了 0.382 ms 的 Inference Latency 性能&#xff0c;打…

11.python并发入门(part9 多进程模块multiprocessing基本用法)

一、回顾多继承的概念。由于GIL&#xff08;全局解释器锁&#xff09;的存在&#xff0c;在python中无法实现真正的多线程&#xff08;一个进程里的多个线程无法在cpu上并行执行&#xff09;&#xff0c;如果想充分的利用cpu的资源&#xff0c;在python中需要使用进程。二、mul…

将不确定变为确定~Flag特性的枚举是否可以得到Description信息

回到目录 之前我写过对于普通枚举类型对象&#xff0c;输出Description特性信息的方法&#xff0c;今天主要来说一下&#xff0c;如何实现位域Flags枚举元素的Description信息的方法。 对于一个普通枚举对象&#xff0c;它输出描述信息是这样的 public enum Status{[Descriptio…

中科大“九章”历史性突破,但实现真正的量子霸权还有多远?

作者 | 马超 出品 | AI科技大本营 头图 | CSDN下载自视觉中国 10月中旬&#xff0c;政府高层强调要充分认识推动量子科技发展的重要性和紧迫性&#xff0c;加强量子科技发展战略谋划和系统布局&#xff0c;把握大趋势&#xff0c;下好先手棋。 今天&#xff0c;我国的量子科技领…

php析构函数的用法

简单的说,析构函数是用来在对象关闭时完成的特殊工作,比如我写的上例,在实例化同时打开某文件,但是它什么时候关闭呢,用完就关闭呗,所以析构函数直接关闭它, 又或者在析构时,我们将处理好的某些数据一并写进数据库,这时可以考虑使用析构函数内完成,在析构完成前,这些对象属性仍…

泛型中? super T和? extends T的区别

经常发现有List<? super T>、Set<? extends T>的声明&#xff0c;是什么意思呢&#xff1f;<? super T>表示包括T在内的任何T的父类&#xff0c;<? extends T>表示包括T在内的任何T的子类&#xff0c;下面我们详细分析一下两种通配符具体的区别。 …

两大AI技术集于一身,有道词典笔3从0到1的飞跃

作者 | Just 出品 | AI科技大本意&#xff08;ID:rgznai100&#xff09; “双十一”结束的钟点刚刚敲响&#xff0c;拥有电子消费品的企业便很快对外界秀了一把今年的销售战绩&#xff0c;网易有道也不例外。在电子词典单品品类榜单上&#xff0c;有道词典笔稳稳拿下天猫和京东…

VIM进阶功能

2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/gunl/archive/2011/08/15/2139588.html 该网页上介绍了以下内容&#xff1a; 查找快速移动光标复制、删除、粘贴数字命令组合快速输入字符替换多文件编辑宏替换TABautocmd常用脚本常用配置另一篇…

最简便的清空memcache的方法

如果要清空memcache的items&#xff0c;常用的办法是什么&#xff1f;杀掉重启&#xff1f;如果有n台memcache需要重启怎么办&#xff1f;挨个做一遍&#xff1f; 很简单&#xff0c;假设memcached运行在本地的11211端口&#xff0c;那么跑一下命令行&#xff1a; $ echo ”f…

mongodb启动

将mongodb安装为Windows服务&#xff0c;让该服务随Windows启动而启动&#xff1a; 开启服务&#xff1a; 转载于:https://www.cnblogs.com/dabinglian/p/6861413.html

赠书 | AI 还原宋代皇帝,原来这么帅?!

整理 | 王晓曼来源 | 程序人生 &#xff08;ID&#xff1a;coder _life&#xff09;封图 | 大谷视频《人工智能还原的宋代皇帝&#xff0c;原来这么帅&#xff1f;&#xff01;》*文末有赠书福利昨日&#xff0c;一条“人工智能还原的宋代皇帝”喜提热搜&#xff0c;博主大谷借…

Deep learning:三十六(关于构建深度卷积SAE网络的一点困惑)

前言&#xff1a; 最近一直在思考&#xff0c;如果我使用SCSAE&#xff08;即stacked convolution sparse autoendoer&#xff09;算法来训练一个的deep model的话&#xff0c;其网络的第二层开始后续所有网络层的训练数据从哪里来呢&#xff1f;其实如果在这个问题中&#xff…

用memcache.php监测memcache的状况

最新的memcache pecl中&#xff0c;新增了一个memcache.php&#xff0c;这个php文件可以用来方便的查看memcache的状况&#xff0c;界面上与apc自带的apc.php风格一致。 如图: 应该算是最方便的监测memcache的办法了。 memcache.php源文件下载 是一个PHP源文件&#xff0c;…

想知道垃圾回收暂停的过程中发生了什么吗?查查垃圾回收日志就知道了!

\关键点\垃圾回收日志中包括着一些关键性能指标&#xff1b; \要做一次正确的垃圾回收分析需要收集许多数据&#xff0c;所以好的工具是非常必要的&#xff1b; \除了垃圾回收之外还有很多事件都可能会让应用程序暂停&#xff1b; \让你的应用程序暂停的事件也会让垃圾回收器暂…

Linux必学的网络操作命令

因为Linux系统是在Internet上起源和发展的&#xff0c;它与生俱来拥有强大的网络功能和丰富的网络应用软件&#xff0c;尤其是TCP/IP网络协议的实现尤为成熟。Linux的网络命令比较多&#xff0c;其中一些命令像ping、ftp、telnet、route、netstat等在其它操作系统上也能看到&am…

丢弃Transformer,FCN也可以实现E2E检测

作者 | 王剑锋来源 | 知乎CVer计算机视觉专栏我们基于FCOS&#xff0c;首次在dense prediction上利用全卷积结构做到E2E&#xff0c;即无NMS后处理。我们首先分析了常见的dense prediction方法&#xff08;如RetinaNet、FCOS、ATSS等&#xff09;&#xff0c;并且认为one-to-ma…

Linux命令基础--uname

uname 显示系统信息 语 法&#xff1a;uname [-amnrsvpio][--help][--version] 补充说明&#xff1a;uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。 参 数&#xff1a; -a或-all 详细输出所有信息&#xff0c;依次为内核名称&#xff0c;主机名&am…

FEC之我见一

顾名思义&#xff0c;FEC前向纠错&#xff0c;根据收到的包进行计算获取丢掉的包&#xff0c;而和大神沟通的结果就是 纠错神髓&#xff1a;收到的媒体包冗余包 > 原始媒体包数据 直到满足 收到的媒体包 冗余包 > 原始媒体包数据 则进入恢复模式&#xff0c;恢复出…

改变Repeater控件中按钮颜色

昨晚有在论坛看到一帖&#xff0c;手上的工作一直忙到现在&#xff0c;Insus.NET现在抽点时间尝试实现它。 Insus.NET没有使用数据库作为数据源&#xff0c;而是使用List<T>作为数据源。因此你在这篇博文中学到很多有关泛型的知识。另外Insus.NET使用CheckBoxList来替代多…

CSDN湘苗培优,遇见更好的自己

CSDN 湘苗培优报名火热进行中&#xff01;JOIN US号外&#xff01;号外&#xff01;“湘苗培优”报名火热进行中&#xff01;????????????????????????为什么要报名“湘苗培优”只要你想学&#xff0c;这里有CSDN技术认证、企业导师零距离技术交流求职…

两个无序单链表,排序后合并成一个有序链表

两个无序单链表&#xff0c;排序后合并成一个有序链表算法思想&#xff1a;用冒泡法&#xff0c;对链表1和2进行排序&#xff0c;对排序后的两个链表&#xff0c;从小到大进行循环&#xff0c;装入链表3中。#include<stdio.h>#include<stdlib.h>struct stud/*定义链…