Beispiel #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));
            }
        }
Beispiel #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);
        }