• 对象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         /// 持续时间,单位s
     36         /// </summary>
     37         public long Duration { get; set; }
     38 
     39         //是否启用
     40         private bool isEnable = true;
     41 
     42         /// <summary>
     43         /// 是否启用
     44         /// </summary>
     45         public bool IsEnable
     46         {
     47             get
     48             {
     49                 return isEnable;
     50             }
     51             set
     52             {
     53                 isEnable = value;
     54             }
     55         }
     56 
     57         /// <summary>
     58         /// 是否使用中
     59         /// </summary>
     60         public bool IsUsing
     61         {
     62             get
     63             {
     64                 if (IsEnable == false) return false;
     65                 if (IsManuelTrigger)
     66                 {
     67                     if (Duration == long.MaxValue)
     68                     {
     69                         return true;
     70                     }
     71                     else
     72                     {
     73                         var span = DateTime.Now - TriggerTime;
     74                         if (span.TotalSeconds > Duration)
     75                             return false;
     76                         else
     77                             return true;
     78                     }
     79                 }
     80                 else
     81                 {
     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

  • 相关阅读:
    10)添加路径并显示
    ueditor使用-图片上传正常,图片显示异常404
    连接mysql出错
    曾经踩过的坑--浏览器兼容-history
    css样式继承(转)
    超链接中文字超长使用省略号代替
    bootstrap-datetimepicker出现时间选择时年份显示1899年的异常
    angularJS:ng-repeat作用域及父作用域调用$parent
    $parse:表达式转换
    angularJS factory中包含xhr时,通过promise获取结果
  • 原文地址:https://www.cnblogs.com/tianqing/p/6760037.html
Copyright © 2020-2023  润新知