/// <summary>
        /// Performs an "intersection" of the two SerializableLists, where only the elements
        /// that are present in both SerializableLists remain.  That is, the element is included if it exists in
        /// both SerializableLists.  The <c>Intersect()</c> operation does not modify the input SerializableLists.  It returns
        /// a <c>Clone()</c> of this SerializableList with the appropriate elements removed.
        /// </summary>
        /// <param name="a">A SerializableList of elements.</param>
        /// <returns>The intersection of this SerializableList with <c>a</c>.</returns>
        public virtual SerializableList <T> Intersect(SerializableList <T> a)
        {
            SerializableList <T> resultSerializableList = (SerializableList <T>) this.Clone();

            if (a != null)
            {
                resultSerializableList.RetainAll(a);
            }
            else
            {
                resultSerializableList.Clear();
            }
            return(resultSerializableList);
        }