/// <summary> /// 获取指定的指针数组中的元素的哈希代码。 /// </summary> /// <param name="obj">要获取哈希代码的指针数组。</param> /// <param name="computed">已经计算过哈希代码的对象。</param> /// <returns><paramref name="obj"/> 中的元素的哈希代码。</returns> protected override int GetHashCodeCore([DisallowNull] T obj, ISet <object> computed) { var array = (Array)(object)obj; var hashCode = array.GetType().GetHashCode(); var methodGet = PointerArrayEqualityComparer <T> .GetMethod; for (int index = 0; index < array.Length; index++) { var item = methodGet.Invoke(array, array.OffsetToIndices(index).Box()); var nextHashCode = PointerEqualityComparer.GetHashCode(item); hashCode = this.CombineHashCode(hashCode, nextHashCode); } return(hashCode); }
/// <summary> /// 确定两个指定指针数组中所包含的元素是否相等。 /// </summary> /// <param name="x">要比较的第一个指针数组。</param> /// <param name="y">要比较的第二个指针数组。</param> /// <param name="compared">已经比较过的对象。</param> /// <returns>如果 <paramref name="x"/> 和 <paramref name="y"/> 中的元素相等, /// 则为 <see langword="true"/>;否则为 <see langword="false"/>。</returns> protected override bool EqualsCore( [DisallowNull] T x, [DisallowNull] T y, ISet <ObjectPair> compared) { var xArray = (Array)(object)x; var yArray = (Array)(object)y; var methodGet = PointerArrayEqualityComparer <T> .GetMethod; for (int index = 0; index < xArray.Length; index++) { var xItem = methodGet.Invoke(xArray, xArray.OffsetToIndices(index).Box()); var yItem = methodGet.Invoke(yArray, yArray.OffsetToIndices(index).Box()); if (!PointerEqualityComparer.Equals(xItem, yItem)) { return(false); } } return(true); }