/// <summary>
        /// Return the HashCode of this object.
        /// </summary>
        /// <returns>The HashCode of this object.</returns>
        public override Int32 GetHashCode()
        {
            unchecked
            {
                return(TransactionId.GetHashCode() * 29 ^
                       Timestamp.GetHashCode() * 23 ^
                       MeterStop.GetHashCode() * 19 ^

                       (IdTag.HasValue
                            ? IdTag.GetHashCode() * 17
                            : 0) ^

                       (Reason.HasValue
                            ? Reason.GetHashCode() * 11
                            : 0) ^

                       TransactionData.GetHashCode());
            }
        }
        /// <summary>
        /// Compares two stop transaction requests for equality.
        /// </summary>
        /// <param name="StopTransactionRequest">A stop transaction request to compare with.</param>
        /// <returns>True if both match; False otherwise.</returns>
        public override Boolean Equals(StopTransactionRequest StopTransactionRequest)
        {
            if ((Object)StopTransactionRequest == null)
            {
                return(false);
            }

            return(TransactionId.Equals(StopTransactionRequest.TransactionId) &&
                   Timestamp.Equals(StopTransactionRequest.Timestamp) &&
                   MeterStop.Equals(StopTransactionRequest.MeterStop) &&

                   ((!IdTag.HasValue && !StopTransactionRequest.IdTag.HasValue) ||
                    (IdTag.HasValue && StopTransactionRequest.IdTag.HasValue && IdTag.Equals(StopTransactionRequest.IdTag))) &&

                   ((!Reason.HasValue && !StopTransactionRequest.Reason.HasValue) ||
                    (Reason.HasValue && StopTransactionRequest.Reason.HasValue && Reason.Equals(StopTransactionRequest.Reason))) &&

                   TransactionData.Count().Equals(StopTransactionRequest.TransactionData.Count()));
        }