您的位置:首页 > 其它

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

2017-05-12 10:35 253 查看
最近编码的过程中,使用了对象本地内存缓存,缓存用了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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: