예제 #1
0
 /// <summary>
 /// Two HashableView matrices are equal if they are MatrixEquals, that is, they have the same
 /// RowKeys and ColKeys (in the same order), the same special MissingValue, and the same values.
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 public override bool Equals(object obj)
 {
     HashableView<TRowKey, TColKey, TValue> other = obj as HashableView<TRowKey, TColKey, TValue>;
     if (other == null)
     {
         return false;
     }
     else
     {
         return _hashCode == other._hashCode && this.MatrixEquals(other);
     }
 }
예제 #2
0
        /// <summary>
        /// Creates a view of the parent matrix which is hashable. For example, it can be used as the key of a dictionary.
        /// This is a 'view' in the sense that no copying an every little extra memory is used.
        /// 
        /// Two HashableView matricies are equal if their RowKeys and ColKeys (in order), MissingValue, and values are equal.
        /// They will have the same hashcode if they are equal.
        /// 
        /// The hashcode is computed only once when the the HashableView is contructed, so a HashableView does not allow
        /// its values to be changed. Also, changing values of the parent will give unexpected results.
        /// 
        /// When used by Dictionary or HashSet, a full call of MatrixEquals (which looks at every value) is needed to confirm
        /// that two matrices with the same hashcode are really equal.
        ///</summary>
        /// <typeparam name="TRowKey">The type of the row key. Usually "String"</typeparam>
        /// <typeparam name="TColKey">The type of the col key. Usually "String"</typeparam>
        /// <typeparam name="TValue">The type of the value, for example, double, int, char, etc.</typeparam>
        /// <param name="parentMatrix">The matrix to wrap.</param>
        /// <returns>A hashable matrix</returns>
        static public Matrix<TRowKey, TColKey, TValue> HashableView<TRowKey, TColKey, TValue>(
            this Matrix<TRowKey, TColKey, TValue> parentMatrix)
        {
            //If this is a HashableView of a HashableView, simplify
            HashableView<TRowKey, TColKey, TValue> parentHashableViewOrNull = parentMatrix as HashableView<TRowKey, TColKey, TValue>;
            if (null != parentHashableViewOrNull)
            {
                return parentHashableViewOrNull.ParentMatrix;
            }

            var hashableView = new HashableView<TRowKey, TColKey, TValue>();
            hashableView.ParentMatrix = parentMatrix;
            return hashableView;
        }