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












