最近编码的过程中,使用了对象本地内存缓存,缓存用了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

浙公网安备 33010602011771号